类型错误:将数据插入 postgres db 时,dict 不是序列

问题描述 投票:0回答:2

需要帮助解决错误。下面是我向 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, 数据) “类型错误:字典不是序列”

python-3.x psycopg2
2个回答
1
投票

根据文档文档数据应该是元组序列,而不是字典(示例:{name:harry})]。像这样:

nums = ((1,), (5,), (10,))
cur.executemany("INSERT INTO test (num) VALUES (%s)", nums)

0
投票

您的值占位符 (

%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
方法不会提供任何性能改进 - 为此,您需要使用 快速执行助手

© www.soinside.com 2019 - 2024. All rights reserved.