如标题所示,我想在数据库中插入一个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...
答案 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。