将二进制数据保存到MySQLdb - Python
我在网上搜索过,也在这个网站上找过,但没有找到具体的解决办法,代码也无法正常运行。以下是我的代码:
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()
总结一下:
- 首先确保你已经连接上数据库(如果不知道怎么做,可以看看MySQLdb的文档)
- 你不需要对整个查询进行转义,只需对数据部分进行转义,分别将语句和数据传给
cursor.execute()
,这样游标会帮你处理转义。 - 不要给
'%s'
加引号,MySQLdb会帮你处理这个。 - 你的数据库是事务性的(比如InnoDB)吗?如果是这样你才需要使用
conn.commit()
,如果不是事务引擎就不需要。 - 我看不到你是怎么构建数据库表的,所以不能保证这个方法一定有效。作为练习,你有没有尝试创建一个非常简单的数据库表,并用MySQLdb练习插入数据,以便熟悉这个API?