使用 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()
filename
和 filecontent
位于查询存储过程的结果中。
结论: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