Psycopg2 在 postgres 数据库中插入 python 字典

新手上路,请多包涵

在 python 3+ 中,我想将字典(或 pandas 数据框)中的值插入到数据库中。我选择了带有 postgres 数据库的 psycopg2。

问题是我想不出正确的方法来做到这一点。我可以很容易地连接一个 SQL 字符串来执行,但是 psycopg2 文档明确警告不要这样做。理想情况下,我想做这样的事情:

 cur.execute("INSERT INTO table VALUES (%s);", dict_data)

并希望 execute 能够找出 dict 的键与表中的列相匹配。这没有用。从 psycopg2 文档的示例中我得到了这种方法

cur.execute("INSERT INTO table (" + ", ".join(dict_data.keys()) + ") VALUES (" + ", ".join(["%s" for pair in dict_data]) + ");", dict_data)

我从中得到

TypeError: 'dict' object does not support indexing

将字典插入具有匹配列名的表中的最自然方法是什么?

原文由 Paamand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

两种解决方案:

 d = {'k1': 'v1', 'k2': 'v2'}

insert = 'insert into table (%s) values %s'
l = [(c, v) for c, v in d.items()]
columns = ','.join([t[0] for t in l])
values = tuple([t[1] for t in l])
cursor = conn.cursor()
print cursor.mogrify(insert, ([AsIs(columns)] + [values]))

keys = d.keys()
columns = ','.join(keys)
values = ','.join(['%({})s'.format(k) for k in keys])
insert = 'insert into table ({0}) values ({1})'.format(columns, values)
print cursor.mogrify(insert, d)

输出:

 insert into table (k2,k1) values ('v2', 'v1')
insert into table (k2,k1) values ('v2','v1')

原文由 Clodoaldo Neto 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有时会遇到这个问题,尤其是关于 JSON 数据,我自然希望将其作为 dict 来处理。非常相似。 . .但也许更具可读性?

 def do_insert(rec: dict):
    cols = rec.keys()
    cols_str = ','.join(cols)
    vals = [ rec[k] for k in cols ]
    vals_str = ','.join( ['%s' for i in range(len(vals))] )
    sql_str = """INSERT INTO some_table ({}) VALUES ({})""".format(cols_str, vals_str)
    cur.execute(sql_str, vals)

我通常从迭代器内部调用这种类型的东西,并且通常包装在 try/except 中。游标 (cur) 已经在外部作用域中定义,或者可以修改函数签名并传入游标实例。我很少只插入一行。 . .和其他解决方案一样,这允许缺少列/值,前提是底层模式也允许它。只要键视图下的字典在插入时没有被修改,就不需要按名称指定键,因为值将按照它们在键视图中的顺序进行排序。

原文由 rosey99 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进