如何用泡菜在Postgresql DB中插入序列化对象?

时间:2019-06-25 15:31:17

标签: python postgresql pickle psycopg2 xgboost

如标题所示,我想在数据库中插入一个xgboost对象。我正在使用psycopg2和postgresql。

为了插入序列化版本,我用转储对xgboost模型进行了腌制。

query = "INSERT INTO reporting_ml.model (model) VALUES (%(model)s)"
cursor_dev.execute(query % {"model": pickle.dumps(model)})

这就是我得到的:

syntax error at or near "\"
LINE 2: ... 
\x04\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00\'\x00\x00\x...

1 个答案:

答案 0 :(得分:0)

有人要求解释@Tammem Sa的解决方案。 通过查看Psycopg's官方documentation

<块引用>

警告从不,从不,从不使用 Python 字符串连接 (+) 或 字符串参数插值 (%) 将变量传递给 SQL 查询 细绳。甚至在枪口下也不行。

我们看到这是阵型问题。

他们特别引用:

<块引用>

因为数据类型之间的差异,有时是微妙的 表示,一种简单的查询字符串组合的方法,例如 作为使用 Python 字符串连接,是一个可怕的秘诀 问题:

下面是一个例子:

>>> SQL = "INSERT INTO authors (name) VALUES ('%s');" # NEVER DO THIS
>>> data = ("O'Reilly", )
>>> cur.execute(SQL % data) # THIS WILL FAIL MISERABLY
ProgrammingError: syntax error at or near "Reilly"
LINE 1: INSERT INTO authors (name) VALUES ('O'Reilly')
                                          ^

根据文档,在 SQL 命令中传递变量的正确(也是唯一)方法是使用 execute() 方法的第二个参数:

>>> SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
>>> data = ("O'Reilly", )
>>> cur.execute(SQL, data) # Note: no % operator

我的额外两美分:

对于张量或向量,列的首选数据类型是 Bytea。