将二进制数据保存到MySQLdb - Python

1 投票
1 回答
4406 浏览
提问于 2025-04-16 12:30

我在网上搜索过,也在这个网站上找过,但没有找到具体的解决办法,代码也无法正常运行。以下是我的代码:

    binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll))

    sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment) \
    VALUES ('%s','%s','%s','%s','%s','%s') ON DUPLICATE KEY UPDATE filename='%s',fileextension='%s'""", attach.attno,\
attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension

    try:
        cursor.execute(MySQLdb.escape_string(sql_stmt))
        conn.commit()

attach.attcoll 是从 SQLite 的二进制大对象(blob)通过 JSON 格式传过来的数据,客户端使用的是 Java 代码。我想把 binData 写入 MySQL 数据库,使用的是 MySQLdb,但总是出现类型错误(TypeError),并且返回代码是 500。有没有什么办法可以解决这个问题?我想把 binData 存储到 MySQL 的 blob 类型中。

1 个回答

1

这里有一些要点:

binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll))
sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment)
VALUES (%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE filename=%s,fileextension=%s""" 

params = (attach.attno,attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension)

cursor.execute(sql_stmt, params)
conn.commit()

总结一下:

  1. 首先确保你已经连接上数据库(如果不知道怎么做,可以看看MySQLdb的文档)
  2. 你不需要对整个查询进行转义,只需对数据部分进行转义,分别将语句和数据传给cursor.execute(),这样游标会帮你处理转义。
  3. 不要给'%s'加引号,MySQLdb会帮你处理这个。
  4. 你的数据库是事务性的(比如InnoDB)吗?如果是这样你才需要使用conn.commit(),如果不是事务引擎就不需要。
  5. 我看不到你是怎么构建数据库表的,所以不能保证这个方法一定有效。作为练习,你有没有尝试创建一个非常简单的数据库表,并用MySQLdb练习插入数据,以便熟悉这个API?

撰写回答