我正在尝试使用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 db一起使用?
答案 0 :(得分:2)
正如@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交互所必需的。
答案 1 :(得分:1)