开发者

Insert python list into Postgres database

开发者 https://www.devze.com 2023-04-13 09:29 出处:网络
I am having trouble in formatting the li开发者_运维知识库st for insertion using psycopg. Here is a sample of code i am trying to do.

I am having trouble in formatting the li开发者_运维知识库st for insertion using psycopg. Here is a sample of code i am trying to do. Basically I am just reading data from one table and trying to insert it into another table.

Code:

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

The result returned by first select query is like this:

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

When I try to insert this into another table I get the following format error.

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

I tried cur.mogrify, but it does not seem to help.

Please let me know if anyone has a work around for this issue.

Thanks Adi


I don't think mogrify is needed here. Use executemany and pass rows as the second argument.

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

Using parametrized arguments helps prevent SQL injection.

The table name can not be parametrized, so we do have to use string interpolation to place the table name in the SQL query. %%s gets escapes the percent sign and becomes %s after string interpolation.


By the way, (as a_horse_with_no_name has already pointed out) you can use the INSERT INTO ... SELECT form of INSERT to perform both SQL queries as one:

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

Per the question in the comments, if there are multiple fields, then the SQL becomes:

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

(If you use the format method, then you don't have to escape all the other %ss.)

0

精彩评论

暂无评论...
验证码 换一张
取 消