Python2.7 使用 format() 和 sqlite 的缓冲区对象生成 sql 查询

标签 python sqlite binary format

我尝试使用 .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/

相关文章:

c - C 中的按位连接

计算无符号整数中的位数

python - 如何找出列表中以元音开头的单词?

Python 线程堆栈大小和段错误

python - raw_input 的奇怪重定向效果

sql - 计算字段中的默认值

c# - 选择日期时间最长的用户名

sql - 有没有一种方法可以使用条件在一个表中进行多次插入?

math - 从一个较小的二进制数中减去一个较大的无符号二进制数

python - .xlsx 和 xls(最新版本)使用 python 到 pdf