Pyodbc:在MS SQL Server中插入pickle Python模型时出错



我试着解决这个问题有一段时间了,但遇到了很多问题。想知道是否有人见过这个。

我正在尝试在Python中pickle一个简单的RandomForestClassifier(sklearn(,并使用pyodbc将其保存到MS SQL Server数据库中。特别是,我使用UPDATE语句,因为我正在更新以前训练过的模型。

这是我正在使用的查询:

RF_serialized = pickle.dumps(RF)
RF_serialized_ins = str(RF_serialized)[1 : ] # doing this to cut off the leading 'b' from 
# Python's byte data, per suggestions from other answers
q = "UPDATE table 
SET serializedModel = CONVERT(VARBINARY(MAX), {}) 
WHERE IDa = {} AND 
IDb = {} AND 
IDc = {}".format(RF_serialized_ins, "x", "y", "z")

不过,我一直收到以下非特定类型的错误:

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server]Syntax error, permission violation, or other nonspecific error (0) (SQLExecDirectW)')

以前有人碰到过这个吗?我确信ID和筛选器是正确的,等等。目标列的数据类型是VARBINARY(MAX)。一个想法是:腌制的物体太大了吗?对象的大小:

print("Type of python object:", type(RF_serialized))
print("The size of the pickled RF model is:", RF_serialized.__sizeof__())
Type of python object: <class 'bytes'>
The size of the pickled RF model is: 5487942

以下是最终成功的方法(感谢@Gord Thompson让我朝着正确的方向前进(:

  1. 使用转义参数化——根据pyodbc标准——而不是Python的.format()。我们最终将查询更改为如下内容:
q = "UPDATE table 
SET serializedModel = CONVERT(VARBINARY(MAX), ?) 
WHERE IDa = CONVERT(uniqueidentifier, ?) AND 
IDb = CONVERT(uniqueidentifier, ?) AND 
IDc = CONVERT(uniqueidentifier, ?)"
args = (RF_serialized,
"x",
"y",
"z")
cursor.execute(q, args)
cnxn.commit()
  1. 使用CONVERT(uniqueidentifier, ?),而不是尝试为字符串放入特殊字符(例如'(,因为SQL Server将GUID/唯一标识符视为数据类型
  2. 在运行测试/故障排除时,我有几个额外的查询,我认为其中一个查询上有一个额外的.execute()——这完全打乱了我想要修复的查询

最新更新