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

时间:2014-09-12 08:36:01

标签: sql python-2.7 binary pyramid pymssql

我正在尝试使用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一起使用?

2 个答案:

答案 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()

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

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

答案 1 :(得分:1)