【问题标题】:saving python object in postgres table with pickle用pickle将python对象保存在postgres表中
【发布时间】:2019-12-29 17:10:49
【问题描述】:

我有一个创建一些对象的 python 脚本。 我希望能够将这些对象保存到我的 postgres 数据库中以供以后使用。

我的想法是我可以腌制一个对象,然后将其存储在数据库中的一个字段中。 但是关于如何存储、检索和使用数据,我正在兜圈子。

我尝试将 pickle 二进制字符串存储为 text,但我不知道如何对其进行编码/转义。那么如何将字符串作为二进制字符串加载到unpickle。

我尝试将数据存储为bytea,无论是否使用psycopg2.Binary(data)。 然后读入缓冲区并使用base64.b64encode(result) 进行编码,但结果不一样,不能解开。

有没有一种简单的方法可以在 SQL (postgres) 数据库中存储和检索 python 对象?

【问题讨论】:

  • 您确定以正确的顺序调用base64 函数吗?只是检查一下,你想要的是:存储object->pickle->base64-encode->DB。回读:DB->base64-decode->unpickle->object
  • 我认为这个答案会对你有所帮助。 stackoverflow.com/questions/30469575/…
  • @SergioPulgarin 在发送到数据库之前我没有编码。如果我这样做,我应该将它作为文本或二进制存储在数据库中吗?

标签: python postgresql pickle


【解决方案1】:

根据@SergioPulgarin 的评论,我尝试了以下方法!

注意@Tomalak 的评论后编辑2

存储:

  1. 将对象腌制为二进制字符串

    pickle_string = pickle.dumps(object)

  2. 将 pickle 字符串存储在 postgres 的 bytea(二进制)字段中。在 Psycopg2 中使用简单的 INSERT 查询

检索:

  1. Select Psycopg2 中的字段。 (简单的SELECT查询)

  2. 解压解码结果

    retrieved_pickle_string = pickle.loads(decoded_result)

希望对尝试做类似事情的人有所帮助!

【讨论】:

  • 这里的“编码为base64”步骤是多余的。您可以将腌制对象直接存储在二进制字段中。
  • @Tomalak 感谢您指出这一点,我删除了该步骤,它也很好用!
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多