为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 python 对象插入到 postgreSQL

如何将 python 对象插入到 postgreSQL

凤凰求蛊 2023-02-22 15:56:25
我发现这个问题在 stackoverflow 中使用 pickle 在 postgres 表中保存 python 对象。我有一个创建一些对象的 python 脚本。我希望能够将这些对象保存到我的 postgres 数据库中以备后用。根据@SergioPulgarin 的评论,我尝试了以下有效的方法!存储:将对象腌制为二进制字符串 pickle_string = pickle.dumps(object)将 pickle 字符串存储在 postgres 的 bytea(二进制)字段中。在 Psycopg2 中使用简单的 INSERT 查询恢复:选择 Psycopg2 中的字段。(简单的 SELECT 查询)解开解码结果 retrieved_pickle_string = pickle.loads(decoded_result)我转储了泡菜文件。现在我试图将它加载到数据库中。我的问题是我找不到正确的语法来做到这一点......我已经在带有 psycopg2 的 python 文件中尝试过它:我已经转储了 pickle 对象并连接到数据库。我试图将数据类型更改为字节,然后将 pickle 插入数据库:pickle_obj = bytes(pickle_file)query = "INSERT INTO schema.table (col1, ...) VALUES (%%s, ...)" % pickle_objcursor.execute(query)我收到此错误:Traceback (most recent call last):  File "/path/to/file.py", line 18, in <module>    cursor.execute(query)psycopg2.errors.SyntaxError: syntax error at or near "K"LINE 1: ...e1_h\x15Nh\x16K\x00h\x17Nh\x18Nh\x19\x89h&K\x0bh\'K\x01h(h+h...                                                         ^进程结束,退出代码为 1然后我尝试直接从 postgreSQL 插入它(但我也不确定这段代码,因为它也不起作用。)INSERT INTO table SELECT PG_Read_File('/home/...)我认为我的语法不是 100% 正确?那你是怎么做到的?感谢您的提示!尝试按照文档中的说明使用 psycopg2.Binary 包装此对象。 https://www.psycopg.org/docs/usage.html#adapt-binary这些帖子似乎被删除了,但因为它对我有用,所以我只是在这里添加它。谢谢你!
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

您应该始终使用参数化查询将值替换为查询。字符串构造或格式化会使您容易受到 SQL 注入攻击。除了安全优势之外,使用参数化查询还允许驱动程序为您处理转义和引用。


完成您所要求的最短路径是使用bytea表中的列。


如果你的表看起来像这样:


  Column   |  Type   

-----------+---------

 id        | integer serial primary key

 bytesdata | bytea   

然后这insert将起作用:


cursor.execute("insert into mytable (bytesdata) values (%s) returning id", (pickle_obj, ))

inserted_id = cursor.fetchone()[0]

connection.commit()

稍后要检索此对象,您可以执行:


cursor.execute("select bytesdata from mytable where id = %s", (inserted_id, ))

row = cursor.fetchone()

retrieved_pickle_obj = row[0]


查看完整回答
反对 回复 2023-02-22
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信