将Python字典插入SQLite数据库

4 投票
2 回答
6497 浏览
提问于 2025-04-17 09:58

我有一个字典,想把里面的所有值添加到一个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 个回答

2

我遇到了同样的问题,不过我发现并不是所有的字典条目都包含表格的所有列。于是我想出了以下的解决办法。

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

据我所知,当查询中有一个“?”占位符时,execute() 方法会根据参数类型自动进行正确的转义处理。所以,下面的代码应该可以正常工作:

query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags))
cursor.execute(query, Tags)

撰写回答