【问题标题】:Unable to insert binary data from mssql into sqlite3 using python无法使用 python 将 mssql 中的二进制数据插入 sqlite3
【发布时间】:2012-08-06 19:07:24
【问题描述】:

我正在尝试查询 Microsoft SQL 2005 数据库,处理数据并将密钥写入我更新到我机器上本地 sqllite3 数据库存储的数据中。

我使用的工具是 python 2.7、pyodbc 和 sqllite3。我在 Windows 7 上,我尝试使用带有 pyodbc 的 sql server 和 sql 本机客户端驱动程序连接到我的 mssql db 的驱动程序,两者都产生相同的结果。

我遇到问题的字段是 mssql 中的二进制 (16) 的 uuid 字段。当我使用 pyodbc 查询数据时,它会以 bytearray() 形式返回给我。

这是我运行以下命令时得到的输出。

id = mycursor.fetchone()
print id

àO÷�eÅO‹1ÝWt'E

repr(id)

字节数组(b'\xe0O\xf7\x1d\x9de\xc5O\x8b1\x0e\xddWt\x91E')

当我将该 ID 插入 sqllite3 数据库时,我得到以下信息。

s = sqlite3.connect('tmp.db')
cursor = s.cursor()
s.execute("create table recs(uuid blob)")
s.commit()
s.execute("insert into recs (uuid) values(?)", id)

1 s.execute("插入recs(uuid)值(?)", id)

ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 16 个。

【问题讨论】:

    标签: python sqlite pyodbc


    【解决方案1】:

    Python 值需要是buffer 对象:

    >>> s.execute("insert into recs (uuid) values(?)", (buffer(id), ))
    <sqlite3.Cursor object at 0x011CD2E0>
    >>> r = s.execute("select * from recs").fetchone()
    >>> r
    (<read-write buffer ptr 0x011F9280, size 16 at 0x011F9260>,)
    >>> r[0]
    <read-write buffer ptr 0x011F9280, size 16 at 0x011F9260>
    >>> str(r[0])
    '\xe0O\xf7\x1d\x9de\xc5O\x8b1\x0e\xddWt\x91E'
    >>> str(r[0]) == id
    True
    

    【讨论】:

    • 我收回它,这行得通!我错过了括号。非常感谢!
    • MRAB 我做了一些研究,我明白为什么现在需要缓冲区,但仍然不清楚为什么它需要在一个元组中。
    • execute 方法要求占位符的值位于元组中。只是碰巧在这种情况下有 1 个占位符,所以它需要 1 元组中的值。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2014-08-19
    • 2015-01-16
    相关资源
    最近更新 更多