将python列表插入Postgres数据库

我在使用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)))

一个选择查询返回的结果如下:

[([6193, 3975, 4960, 5286, 3380, 970, 3328, 3173, 2897, 2457, 2443, 2674, 2172, 2740, 3738, 4907, 3691, 4234, 3651, 3215],)]

当我尝试将其插入另一个表时,我得到以下格式错误.

   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...

我试过cur.mogrify,但它似乎没有帮助.

如果有人解决这个问题,请告诉我.

谢谢
阿迪

解决方法:

我认为这里不需要mogrify.使用executemany并传递行作为第二个参数.

cur.executemany(
    """INSERT INTO "%s" (data) VALUES (%%s)""" % (args.tableName),rows)

使用参数化参数有助于防止SQL injection.

表名不能参数化,因此我们必须使用字符串插值将表名放在SQL查询中. %% s将转义百分号,并在字符串插值后变为%s.

顺便说一下,(如a_horse_with_no_name has already pointed out)你可以使用INSERT的INSERT INTO … SELECT form来执行两个SQL查询

cur.execute(
    """INSERT INTO %s (data)
       SELECT data FROM Table1
       WHERE lat=-20.004189 AND lon=-63.848004""" % (args.tableName))

根据评论中的问题,如果有多个字段,则sql变为:

cur.executemany(
    """INSERT INTO {t} (lat,lon,data1,data2) 
       VALUES (%s,%s,%s,%s)""".format(t=args.tableName),rows)

(如果使用format方法,则不必转义所有其他%ss.)

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...