gpt4 book ai didi

python - 将 pyodbc.Binary 数据 (BLOB) 插入 SQL Server 图像列

转载 作者:太空狗 更新时间:2023-10-30 02:48:44 25 4
gpt4 key购买 nike

我正在尝试将二进制数据插入到 SQL Server 数据库中数据类型为 image 的列中。我知道 varbinary(max) 是首选数据类型,但我无权更改架构。

无论如何,我正在读取文件的内容并将其包装在 pyodbc.Binary() 中,如下所示:

f = open('Test.ics', 'rb')
ablob = f.read().encode('hex')
ablob = pyodbc.Binary(ablob)

当我打印 repr(ablob) 时,我看到了正确的值 bytearray(b'424547494e3a5 . . .(添加了省略号)。

但是,插入之后

insertSQL = """insert into documents(name, documentType, document, customerNumber) values(?,?,?,?)"""
cur.execute(insertSQL, 'test200.ics', 'text/calendar', pyodbc.Binary(ablob), 1717)

文档列的值为 0x343234353 。 . . 看起来好像十六进制数据已转换为 ASCII 字符代码。

我认为将值包装在 pyodbc.Binary() 中可以解决这个问题?任何帮助将不胜感激。

我正在使用 Python 2.7 和 SQL Server 2008 R2 (10.50)。

编辑:

beargle 友善地指出我不必要地调用了 encode('hex'),这导致了我的问题。我相信这一定是将数据强制转换为字符串(尽管更全面的解释会有所帮助)。

工作代码:

ablob = pyodbc.Binary(f.read())
cur.execute(insertSQL, 'test200.ics', 'text/calendar', ablob, 1717)

最佳答案

首先确保使用 with open(..)读取文件 ( another example )。这会在文件对象耗尽引发异常时自动关闭它们。

# common vars
connection = pyodbc.connect(...)
filename = 'Test.ics'
insert = 'insert into documents (name, documentType, document, customerNumber)'

# without hex encode
with open(filename, 'rb'):
bindata = f.read()

# with hex encode
with open(filename, 'rb'):
hexdata = f.read().encode('hex')

# build parameters
binparams = ('test200.ics', 'text/calendar', pyodbc.Binary(bindata), 1717)
hexparams = ('test200.ics', 'text/calendar', pyodbc.Binary(hexdata), 1717)

# insert binary
connection.cursor().execute(insert, binparams)
connection.commit()

# insert hex
connection.cursor().execute(insert, hexparams)
connection.commit()

# print documents
rows = connection.cursor().execute('select * from documents').fetchall()
for row in rows:
try:
# this will decode hex data we inserted
print str(row.document).decode('hex')
# attempting to hex decode binary data throws TypeError
except TypeError:
print str(row.document)

我猜您通过查看 Management Studio 中的结果获得了 0x343234353... 数据:

SQL Server Management Studio results

这并不意味着数据以这种方式存储,它只是 Management Studio 表示 imagetextntextvarbinary 等结果 Pane 中的数据类型。

关于python - 将 pyodbc.Binary 数据 (BLOB) 插入 SQL Server 图像列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11836924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com