如何使用Pscycopg2将字典插入Postgresql表

时间:2018-08-10 03:43:41

标签: python postgresql psycopg2

如何将python字典插入Postgresql2表中?我不断收到以下错误,因此我的查询格式不正确:

  

“至”行或附近的错误语法错误第1行:插入bill_summary VALUES(用于指定...的功能。

import psycopg2
import json
import psycopg2.extras
import sys
with open('data.json', 'r') as f:
        data = json.load(f)
con = None
try:
    con = psycopg2.connect(database='sanctionsdb', user='dbuser') 
    cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
    cur.execute("CREATE TABLE bill_summary(title VARCHAR PRIMARY KEY, summary_text VARCHAR, action_date VARCHAR, action_desc VARCHAR)")
    for d in data:
        action_date = d['action-date']
        title = d['title']
        summary_text = d['summary-text']
        action_date = d['action-date']
        action_desc = d['action-desc']
        q = "INSERT INTO bill_summary VALUES(" +str(title)+str(summary_text)+str(action_date)+str(action_desc)+")"
        cur.execute(q)
    con.commit()

except psycopg2.DatabaseError, e:

    if con:
        con.rollback()

    print 'Error %s' % e    
    sys.exit(1)
finally:

    if con:
        con.close()

2 个答案:

答案 0 :(得分:1)

您应该将字典用作cursor.execute()的第二个参数。请参见此语句in the documentation:

之后的示例代码
  在查询中使用%(name)s占位符并在映射中指定值,也支持

命名参数。

所以您的代码可能像这样简单:

with open('data.json', 'r') as f:
    data = json.load(f)

print(data)

""" above prints something like this:

{'title': 'the first action', 'summary-text': 'some summary', 'action-date': '2018-08-08', 'action-desc': 'action description'}

use the json keys as named parameters:
"""

cur = con.cursor()
q = "INSERT INTO bill_summary VALUES(%(title)s, %(summary-text)s, %(action-date)s, %(action-desc)s)"
cur.execute(q, data)
con.commit()

还请注意此警告(from the same page of the documentation)

  

警告::从不,从不,从不使用Python字符串串联(+)或字符串参数插值(%)将变量传递给SQL查询字符串。甚至没有枪口。

答案 1 :(得分:0)

 q = "INSERT INTO bill_summary VALUES(" +str(title)+str(summary_text)+str(action_date)+str(action_desc)+")" 

您以错误的方式编写查询,通过连接值,它们应该是逗号分隔的元素,如下所示:

q = "INSERT INTO bill_summary VALUES({0},{1},{2},{3})".format(str(title), str(summery_text), str(action_date),str(action_desc)) 

由于您没有指定列名,所以我已经假定它们的顺序与您在插入查询中写入值的顺序相同。在postgresql中基本上有两种编写插入查询的方法。一种是通过指定列名称及其对应的值,如下所示:

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);

另一种方法是,如果要为表的所有列添加值,则可能不需要在SQL查询中指定列名称。但是,请确保值的顺序与表中各列的顺序相同。您在查询中使用的内容,例如:

INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);