python - Pyodbc:将腌制 Python 模型插入 MS SQL Server 时出错
问题描述
一段时间以来一直试图解决这个问题,但遇到了很多问题。想知道是否有人以前见过这个。
我正在尝试pickle
在 Python 中创建一个简单的 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 让我朝着正确的方向前进):
- 使用转义参数化 - 根据
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()
- 使用
CONVERT(uniqueidentifier, ?)
而不是尝试为字符串添加特殊字符(例如\'
),因为 SQL Server 将 GUID/唯一标识符视为数据类型。 - 我在运行测试/故障排除时遇到了一些额外的查询,我认为其中一个额外
.execute()
的查询 - 这完全与我实际上试图修复的查询混淆了。
推荐阅读
- reactjs - 在 GraphQL 中定义变量的位置
- macos - 在 macOS 中自定义 Option-Delete(和其他与单词相关的快捷方式)的单词边界?
- powershell - 在 PowerShell 中使用 MailKit 发送附件不会附加
- php - PHP PDO 从 mysql 获取数据并回显它们
- docker - docker 是一种基础架构即代码技术,因为它可以虚拟化操作系统以在单个操作系统实例上处理多个工作负载吗?
- javascript - 未捕获的 SyntaxError:分配中的左侧无效(p5js)
- kotlin - 为什么我不能使用 try/catch 在 Kotlin 协程中捕获异常?
- typescript - 在 TypeScript 中 GeneratorFunction 接口代表什么?
- javascript - 您如何使用 Chrome 分析器中的堆快照来寻找内存泄漏?
- mysql - 如何将csv文件导入mysql而不会出错