使用 python pymssql 将二进制文件插入 MSSQL db (varbinary)

Posted

技术标签:

【中文标题】使用 python pymssql 将二进制文件插入 MSSQL db (varbinary)【英文标题】:Insert binary file into MSSQL db (varbinary) with python pymssql 【发布时间】:2014-09-12 08:36:01 【问题描述】:

我正在尝试使用 存储过程 从使用 pymssql 的金字塔 Web 应用程序中将二进制数据插入 MSSQL 数据库。

相应列的 MSSQL 数据类型为 varbinary(max)

我的问题是:MSSQL 数据库的 varbinary 数据类型希望我在插入二进制文件之前对它做什么?

这是我一直在尝试的:

with open(tmp_file, 'rb') as content_file:
    filecontent = content_file.read()

...然后将filecontent的值传递给存储过程。

在这种情况下tmp_file.png 文件的有效路径。

MSSQL db 回答以下错误:

*** DatabaseError: (257, 'Implicit conversion from data type varchar to varbinary(max) is not 
allowed. Use the CONVERT function to run this query.DB-Lib error message 257, severity 16:\nGeneral
SQL Server error: Check messages from the SQL Server\n')

我可以将filecontent 变量的值插入到 SQLite(varbinary 列)和 mysql 数据库(BLOB 列)中,这没问题。

为什么它不能与 MSSQL 数据库一起使用?

【问题讨论】:

【参考方案1】:

正如@Arno Rinker 指出的那样,从 varchar 到 varbinary 的转换确实存在问题。然而,我最终做了更多的工作来彻底解决我的问题。

我在这里发布我的整个解决方案,以防万一......

with open(tmp_file, 'rb') as content_file:
    filecontent = content_file.read()
    filecontent_hex = '0x'.encode('ascii') + binascii.hexlify(filecontent)

    --> post the value of filecontent_hex to a stored procedure.

存储过程接收filecontent_hex的值作为varchar,然后将其转换为varbinary

从 MSSQL-DB 中获取二进制数据然后我会这样做:

fout = open(filename, "w")
filecontent_unhex = binascii.unhexlify(filecontent)
fout.write(filecontent_unhex[2:])
fout.close()

filenamefilecontent 位于查询存储过程的结果中。

结论:binascii.hexlify()binascii.unhexlify() 对于与 SQLite 和 MySQL 的二进制交互不是必需的。然而,这些步骤似乎是与 MSSQL-DB 交互所必需的。

【讨论】:

【参考方案2】:

也许你必须明确地转换 varchar。这就是您的错误消息所暗示的。

见:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/8f9d772a-4fa2-45b4-9fed-f03c73bd757a/implicit-conversion-from-data-type-varchar-to-varbinary-is-not-allowed-use-the-convert-function-to?forum=transactsql

这似乎解决了同样的问题。

【讨论】:

以上是关于使用 python pymssql 将二进制文件插入 MSSQL db (varbinary)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 pymssql 将 python 列表写入数据库?

我使用 pyinstaller 来打包我的 python 文件。为啥'import pymssql'总是出错

Python 学习 第十三篇:数据的读写-文件DataFramejson和pymssql

Python-MSSQL (pymssql) 设置字段Identity Column

在 Mac OS 10.6 (python 2.6) 上安装/构建 pymssql

通过 pymssql 将 int 变量与 MSSQL 查询结果 Python 进行比较