Sqlite3.Binary给出TypeError:期望的缓冲对象

时间:2015-04-13 19:42:27

标签: python sqlite

我有一个从txt文件中提取的列表,如下所示:

authors = re.match('#@(.*)', line)
if authors:
   authors_list = authors.group(1).split(",")

现在我需要将这些插入到我的数据库中,这应该按如下方式进行:

for a in authors_list:
    c.execute("INSERT INTO authors(Name) VALUES (?)", (a))

但是当我这样做时,我收到以下错误:

ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 17 supplied.

所以我做了一些研究,发现我应该将变量a改为元组(a,),如下:

c.execute("INSERT INTO authors(Name) VALUES (?)", (a,))

我也试过这个:

c.execute("INSERT INTO authors(Name) VALUES (?)", ((a,)))

但是出现了以下错误:

ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

所以我做了更多的研究,发现我应该使用sqlite3的二进制函数。所以我尝试了以下内容:

c.execute("INSERT INTO authors(Name) VALUES (?)", (sqlite3.Binary((a,))))

并收到以下错误:

TypeError: buffer object expected

我一直在三个错误之间来回走,不管我尝试什么组合。任何帮助,将不胜感激。我不知道自己做错了什么。

1 个答案:

答案 0 :(得分:1)

你传入一个元组,而不是字节串:

sqlite3.Binary((a,))

创建一个包含sqlite3.Binary()结果的元组,已传入 a

(sqlite3.Binary(a),)

然后整个语句运行为:

c.execute("INSERT INTO authors(Name) VALUES (?)",
          (sqlite3.Binary(a),))

但是,如果这应该是 text ,那么您通常字节解码为字符串而不是尝试插入二进制数据:

c.execute("INSERT INTO authors(Name) VALUES (?)",
          (a.decode('utf8'),))

这确实假设你的文本是使用UTF-8编解码器编码的;根据需要调整解码以匹配您的数据。