我有一个字典,我想将所有值添加到sqlite数据库。字典中的所有键都存在于数据库中,并且所有键都是string类型。然而,我在将值输入数据库时遇到了麻烦。下面的代码是丑陋的,不安全的,并且每当遇到带有“in it的字符串时都会出错,但它有点工作。
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
再一次,我的问题是我如何才能优雅地将字典中的值添加到数据库中?
P.S。值得注意的是我使用的是Python 2.5.1。
答案 0 :(得分:3)
Afaik,当查询有“?”时占位符execute()方法根据参数类型自动转义。因此,以下内容应该有效:
query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags))
cursor.execute(query, Tags)
答案 1 :(得分:1)
我遇到了同样的问题但是我遇到的问题是并非所有字典条目都包含表格的所有列,因此我创建了以下解决方案
keys, values = zip(*Package.items())
insert_str = "INSERT INTO packages (%s) values (%s)" % (",".join(keys),",".join(['?']*len(keys)))
cursor.execute(insert_str,values)