Adi*_*tya 3 python postgresql psycopg2
我在使用psycopg格式化插入列表时遇到问题.这是我想要做的代码示例.基本上我只是从一个表中读取数据并尝试将其插入另一个表中.
码:
cur.execute("""select data from \"Table1\" where lat=-20.004189 and lon=-63.848004""")
rows = cur.fetchall()
print rows
cur.execute("""INSERT INTO \"%s\" (data) VALUES (ARRAY%s)""" % (args.tableName,rows)))
Run Code Online (Sandbox Code Playgroud)
第一个选择查询返回的结果如下:
[([6193, 3975, 4960, 5286, 3380, 970, 3328, 3173, 2897, 2457, 2443, 2674, 2172, 2740, 3738, 4907, 3691, 4234, 3651, 3215],)]
Run Code Online (Sandbox Code Playgroud)
当我尝试将其插入另一个表时,我得到以下格式错误.
cur.execute(cur.mogrify("""INSERT INTO \"%s\" (data) VALUES (%s)""" % (args.tableName,rows)))
psycopg2.ProgrammingError: syntax error at or near "["
LINE 1: INSERT INTO "DUMMY1km" (data) VALUES ([([6193, 3975, 4960, 5...
Run Code Online (Sandbox Code Playgroud)
我试过cur.mogrify,但它似乎没有帮助.
如果有人为此问题解决,请告诉我.
谢谢阿迪
我觉得mogrify这里不需要.使用executemany和传递rows作为第二个参数.
cur.executemany(
"""INSERT INTO "%s" (data) VALUES (%%s)""" % (args.tableName),rows)
Run Code Online (Sandbox Code Playgroud)
使用参数化参数有助于防止SQL注入.
表名不能参数化,因此我们必须使用字符串插值将表名放在SQL查询中.%%s获取转义百分号并变为%s字符串插值后.
顺便说一句,(如a_horse_with_no_name已指出),你可以使用INSERT INTO ... SELECT形式的INSERT作为一个同时执行的SQL查询:
cur.execute(
"""INSERT INTO %s (data)
SELECT data FROM Table1
WHERE lat=-20.004189 AND lon=-63.848004""" % (args.tableName))
Run Code Online (Sandbox Code Playgroud)
根据评论中的问题,如果有多个字段,则SQL变为:
cur.executemany(
"""INSERT INTO {t} (lat,lon,data1,data2)
VALUES (%s,%s,%s,%s)""".format(t=args.tableName),rows)
Run Code Online (Sandbox Code Playgroud)
(如果你使用这个format方法,那么你不必逃避所有其他%s的.)
| 归档时间: |
|
| 查看次数: |
9388 次 |
| 最近记录: |