我有一个从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
我一直在三个错误之间来回走,不管我尝试什么组合。任何帮助,将不胜感激。我不知道自己做错了什么。
答案 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编解码器编码的;根据需要调整解码以匹配您的数据。