我尝试使用 .format() 和二进制内容构建一个 sql 查询字符串(注入(inject)没有问题)。最小示例需要同一路径中的示例图像。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import sys
try:
con = lite.connect(':memory:')
cur = con.cursor()
binary = lite.Binary(open("woman.jpg", "rb").read())
cur.execute("CREATE TABLE 'Images' ('Data' BLOB)")
cur.execute("INSERT INTO Images(Data) VALUES (?)", (binary,) )
query = "INSERT INTO Images(Data) VALUES ({0})".format(binary)
cur.execute(query) # <- doesn't work obviously
con.commit()
except lite.Error, e:
if con:
con.rollback()
print "Error %s:" % e.args[0]
sys.exit(1)
finally:
if con:
con.close()
就像 http://zetcode.com/db/sqlitepythontutorial/ 中的插入图像示例一样但使用 .format() 查询生成
有没有办法用 .format() 来实现这一点?我想使用一致的方式将数据插入数据库。
谢谢。
最佳答案
您可以根据 SQLite docs 将 BLOB 数据格式化为 BLOB LITERAL 值,例如
X'53514C697465'
二进制数据可以编码为十六进制数字字符串,然后使用格式插入。
with open(path, 'rb') as f:
"X'{0}'".format(r.read().encode('hex'))
关于Python2.7 使用 format() 和 sqlite 的缓冲区对象生成 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15266331/