将一个Python字典插入到SQLite数据库中

4

我有一个字典,想要将其中所有的值添加到sqlite数据库中。字典中的所有键都存在于数据库中,并且所有键的类型都为字符串。然而,我在将值添加到数据库时遇到了困难。下面的代码很丑陋、不安全,并且无法处理带有“"”的字符串,但它基本上能够工作。

Query="INSERT INTO packages VALUES("
    for tag in Tags:
       Query=Query + '"' + Package[tag] + '", '
    Query=Query[:-2]+")"
cursor.execute(Query)

如何优雅地修复这个问题,以使其安全并接受包含 " 的字符串输入?我已经找到了一些其他的方法。例如:

fields = Package.keys()
values = Package.values()
query = "INSERT INTO packages (%s) VALUES (%%s);" % (",".join(fields))
cursor.execute(query, values)

但它会抛出类型错误。
TypeError: function takes at most 2 arguments (38 given)

我目前遇到的最优雅的解决方案似乎是:
sql_insert = ('INSERT INTO packages (%s) VALUES (%s)' % 
             (','.join('%s' % name for name in Package),
             ','.join('%%(%s)s' % name for name in Package)))
cursor.execute(sql_insert, Package)

但是它会抛出一个操作错误,提示:
sqlite3.OperationalError: near "%": syntax error

再次提问,如何优雅安全地将字典中的值添加到数据库中?顺便提一下,我正在使用Python 2.5.1版本。
2个回答

3
据我所知,当查询中有一个“?”占位符时,execute()方法会根据参数类型自动进行正确的转义。因此,以下内容应该可以正常工作:
query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags))
cursor.execute(query, Tags)

除非Tags是一个字典,就像OP正在使用的那样,否则Tags只会传递键名,并且它们将以任意顺序出现。 - Mark Tolonen
不幸的是,这并没有真正起作用,因为它创建了具有字段名称作为数据值的数据库条目。我以为它正在工作,因为这个脚本在运行时没有抛出错误,但是当我今天早上查看数据库时(让它过夜),它没有适当的值。 - Trcx
1
最终,我将字典值转换为列表,然后使用类似于这个答案的代码进行插入。 - Trcx

2

我遇到了同样的问题,但是我的问题是并非所有的字典条目都包含表中的所有列,因此我创建了以下解决方案。

keys, values = zip(*Package.items())
insert_str =   "INSERT INTO packages (%s) values (%s)" % (",".join(keys),",".join(['?']*len(keys)))
cursor.execute(insert_str,values)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接