psycopg2 executemany ERROR: table tuple index out of range
psycopg2 executemany ERROR: table tuple index out of range
我正在尝试将 JSON 文件中的数据插入 Postgres 数据库,但我一直收到此错误 "table tuple index out of range"。
我已经研究了一天,我可以找到我的错误。非常感谢您的帮助。这是我的代码。我正在使用 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"',
'"2013/12/31"',
'"2014"',
'"LLAMADA DEL 066"',
'"(I) El incidente reportado es afirmativo y se a\u00f1ade informaci\u00f3n adicional al evento"',
'"02:11:35"',
'"accidente-choque sin lesionados"',
'“1”',
'"IZTAPALAPA"',
'"01/01/2014"',
'"Enero"',
'-99.07113',
'"EMERGENCIA"'],
['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 emergencias fue despachada, lleg\u00f3 al lugar de los hechos y confirm\u00f3 la emergencia 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)
但我不断收到 错误:列表索引超出范围
是不是因为我用的是列表而不是元组?
我刚刚计算了逗号的数量,您的 sql_insert_query
有 18 列,而 cursor.executemany()
中的两个值列表各有 17 列。你调查过吗?
Edit1:等等,这更琐碎了。您在每个值列表中都缺少一次逗号。搜索 '11' '12'
我正在尝试将 JSON 文件中的数据插入 Postgres 数据库,但我一直收到此错误 "table tuple index out of range"。
我已经研究了一天,我可以找到我的错误。非常感谢您的帮助。这是我的代码。我正在使用 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"', '"2013/12/31"', '"2014"', '"LLAMADA DEL 066"', '"(I) El incidente reportado es afirmativo y se a\u00f1ade informaci\u00f3n adicional al evento"', '"02:11:35"', '"accidente-choque sin lesionados"', '“1”', '"IZTAPALAPA"', '"01/01/2014"', '"Enero"', '-99.07113', '"EMERGENCIA"'], ['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 emergencias fue despachada, lleg\u00f3 al lugar de los hechos y confirm\u00f3 la emergencia 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)
但我不断收到 错误:列表索引超出范围
是不是因为我用的是列表而不是元组?
我刚刚计算了逗号的数量,您的 sql_insert_query
有 18 列,而 cursor.executemany()
中的两个值列表各有 17 列。你调查过吗?
Edit1:等等,这更琐碎了。您在每个值列表中都缺少一次逗号。搜索 '11' '12'