首页 > 解决方案 > psycopg2 executemany 错误:表元组索引超出范围

问题描述

我正在尝试将 JSON 文件中的数据插入 Postgres 数据库,但我不断收到此错误“表元组索引超出范围”。

我已经坚持了一天,我可以找到我的错误。非常感谢您的帮助。这是我的代码。我正在使用executemany并在数据库中插入 2 行

def bulkInsert(records, db_name, db_user, db_pass, db_endpoint):
try:
    connection = connect(db_name, db_user, db_pass, db_endpoint)
    cursor = connection.cursor()
    sql_insert_query = """ INSERT INTO raw.IncidentesViales (latitud, folio,
                                                            geopoint, hora_creacion,
                                                            delegacion_inicio, dia_semana,
                                                            fecha_creacion, ano,
                                                            tipo_entrada, codigo_cierre,
                                                            hora_cierre, incidente_c4, 
                                                            mes, delegacion_cierre, 
                                                            fecha_cierre, mesdecierre, 
                                                            longitud, clas_con_f_alarma) 
                           VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """

    # executemany() to insert multiple rows rows
    result = cursor.executemany(sql_insert_query, records)
    connection.commit()
    print(cursor.rowcount, "***** Record inserted successfully into table *****")

except (Exception, psycopg2.Error) as error:
    print("***** Failed inserting record into table {} *****".format(error))

finally:
    # closing database connection.
    if (connection):
        cursor.close()
        connection.close()
        print("***** PostgreSQL connection is closed *****")

我正在使用中间函数从 JSON 文件中获取我需要的字段并将它们转换为列表:

def records_rows(record):
l = [json.dumps(record['fields'][campo]) for campo in record['fields'].keys()]
return l

我得到了我想要插入的记录,看起来像这样(2 条记录):

[['19.31469', '"C4/131231/03346"', '[19.31469, -99.07113]', '"22:44:53"', '"IZTAPALAPA"', '"Martes"', '"31 /12/2013"', '"2014"', '"LLAMADA DEL 066"', '"(I) El evente reportado es afirmativo y se a\u00f1ade informaci\u00f3n adicional al eventto"', '"02:11 :35"', '"accidente-choque sin lesionados"', '"1"', '"IZTAPALAPA"', '"01/01/2014"', '"Enero"', '-99.07113', '"紧急情况"'], ['19.36336', '"C4/140101/04189"', '[19.36336, -99.19104]', '"21:45:43"', '"ALVARO OBREGON"', '"Mi\u00e9rcoles"', '"01/01/2014"', '"2014"', '"LLAMADA DEL 066"', '"(A) La unidad de atenci\u00f3n a emergency fue despachada, lleg\u00f3 al lugar de los hechos y confirm\u00f3 la emergency reportada"', '"23:55:59"', '"accidente-choque con lesionados"', '"1"', '"ALVARO OBREGON"', '"01/01/2014"', '"Enero"', '-99.19104', '"URGENCIAS MEDICAS"']](A) La unidad de atenci\u00f3n a Seriouslycias fue despachada, lleg\u00f3 al lugar de los hechos y confirm\u00f3 la emergency reportada"', '"23:55:59"', '"accidente-choque con lesionados" ', '"1"', '"ALVARO OBREGON"', '"01/01/2014"', '"Enero"', '-99.19104', '"URGENCIAS MEDICAS"']](A) La unidad de atenci\u00f3n a Seriouslycias fue despachada, lleg\u00f3 al lugar de los hechos y confirm\u00f3 la emergency reportada"', '"23:55:59"', '"accidente-choque con lesionados" ', '"1"', '"ALVARO OBREGON"', '"01/01/2014"', '"Enero"', '-99.19104', '"URGENCIAS MEDICAS"']]

我这样调用函数:

bulkInsert([records_rows(record) for record in records], db_name, db_user_name, db_user_password, db_host)

但我不断收到错误:列表索引超出范围

是因为我使用的是列表而不是元组吗?

标签: pythonpostgresqlpsycopg2execute

解决方案


我刚刚计算了逗号的数量,您sql_insert_query有 18 列,而其中的两个值列表cursor.executemany()各有 17 个。你调查过吗?

Edit1:等等,这更微不足道。您在每个值列表中都缺少一次逗号。搜索'11' '12'


推荐阅读