需要帮助解决错误。下面是我向 postgres db 插入数据的函数
import psycopg2
def insert_records(data):
conn = psycopg2.connect(
database = "postgres",
user = "some_user",
password = "some_password",
host = "***rds.amazonaws.com",
port="5432"
)
conn.autocommit = True
cursor = conn.cursor()
column_names = ', '.join(data[0].keys()) -->output ID, FIRST_NAME, LAST_NAME
placeholders = ', '.join(['%s' for _ in range(len(data[0]))]) --->output %s, %s, %s
insert_query = f"INSERT INTO {table_name} ({column_names}) VALUES ({placeholders})"
cursor.executemany(insert_query, data)
使用的数据如下:
[{'ID':'ID1234', 'FIRST_NAME':'Thomas', 'LAST_NAME':'Edison'}]
出现类型错误
cursor.executemany(insert_query, 数据) “类型错误:字典不是序列”
根据文档文档数据应该是元组序列,而不是字典(示例:{name:harry})]。像这样:
nums = ((1,), (5,), (10,))
cur.executemany("INSERT INTO test (num) VALUES (%s)", nums)
您的值占位符 (
%s
) 和您的值容器 (a dict
) 之间不匹配。
如果您的值存储在类似
%s
或更传统的 list
之类的序列中,则可以使用 tuple
:
cursor.execute(
"""INSERT INTO tbl (c1, c2) VALUES (%s, %s)""",
('a', 1)
)
如果您的值存储在
dict
中,则占位符格式为 %(key)s
:
cursor.execute(
"""INSERT INTO tbl (c1, c2) VALUES (%(k1)s, %(k2)s)""",
({'k1': 'a', 'k2': 1)
)
无论哪种情况,使用
executemany
时,值容器都必须存储在序列中。
错误信息
类型错误:字典不是序列
告诉您 psycopg2 希望这些值位于 sequence 中,但它们位于 dict 中。
注意:psycopg2 的
executemany
方法不会提供任何性能改进 - 为此,您需要使用 快速执行助手