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

Owa*_*had 2 python postgresql psycopg2

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

错误语法错误位于“To”第 1 行或附近:INSERT INTO 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()
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 5

您应该使用字典作为 的第二个参数cursor.execute()请参阅文档中此语句后的示例代码:

也支持命名参数,在查询中使用 %(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()
Run Code Online (Sandbox Code Playgroud)

另请注意此警告(来自文档的同一页)

警告:永远、永远、永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。即使是在枪口下也不行。