我有这两个清单:
list1=['a','b','c']
list2=['1','2','3']
我正在尝试将这些插入到具有如下字段名称的数据库中:
a | b | c | d | e
我目前正在尝试将这些列表作为字符串,然后简单地添加执行,例如cur.execute(insert,(strList1,strList2))
其中strList1
和strList2
只是使用以下内容形成的list1
和list2
的字符串{/ 1}}
strList1=''
for thing in list1:
strList1+=thing+','
strList1=strList1[:-1]
我当前的SQL语句是:
insert="""insert into tbl_name(%s) values(%s)"""
cur.execute(insert,(strList1,strList2))
我还有一个跟进问题:我怎么能确保说a列需要成为主键,如果它们是空白的话,它会更新其他字段?
答案 0 :(得分:2)
不要在查询中使用%s,因为这是一个安全风险。这是因为%s只是将值插入到字符串中,这意味着它可以是一个完整的单独查询。 而是使用"?"你想要值的地方,并添加第二个参数,以像这样的元组的形式执行
curs.execute("SELECT foo FROM bar WHERE foobar = ?",(some_value,))
或稍稍长的例子
curs.execute("UPDATE foo SET bar = ? WHERE foobar = ?",(first_value,second_value))
编辑:
希望这次我理解你想要什么,遗憾的是你不能使用"?"对于表格,所以你被%s困住了。我做了一个快速的小测试脚本。
import sqlite3
list1=['foo','bar','foobar'] #List of tables
list2=['First_value','second_value','Third_value'] #List of values
db_conn = sqlite3.connect("test.db") #I used sqlite to test it quickly
db_curs = db_conn.cursor()
for table in list1: #Create all the tables in the db
query = "CREATE TABLE IF NOT EXISTS %s(foo text, bar text,foobar text)" % table
db_curs.execute(query)
db_conn.commit()
for table in list1: #Insert all the values into all the tables
query = "INSERT INTO %s VALUES (?,?,?)" % table
db_curs.execute(query,tuple(list2))
db_conn.commit()
for table in list1: #Print all the values out to see if it worked
db_curs.execute("SELECT * FROM %s" % table)
fetchall = db_curs.fetchall()
for entry in fetchall:
print entry[0], entry[1],entry[2]
答案 1 :(得分:0)
你可以在这些名单上做一件事,让事情变得更容易......
list1=['a','b','c']
print ",".join(list1)
#a,b,c
你的插页看起来不错。看起来像批量插入将是唯一的其他选择。
答案 2 :(得分:0)
这是预处理语句的工作方式(简化): *语句通过参数列表发送到数据库; *语句从语句缓存中检索,如果不存在,则准备并添加到语句缓存中; *应用参数; *声明已执行。
语句必须完整,除了参数被%s(或?或:parm取代,取决于所使用的语言)。参数只是您的最终数字/字符串/日期/等值。因此标签或其他部件无法更换。
在您的情况下,这意味着:
insert="""insert into tbl_name(%s) values(%s)"""
应该变得像:
insert="""insert into tbl_name(a,b,c) values(%s,%s,%s)"""
答案 3 :(得分:0)
要使用参数,您必须提供"%s" (或%d,无论如何)每个项目。您可以使用以下两个列表/元组:
insert="""insert into tbl_name (%s,%s,%s) values (%s, %s, %s);"""
strList1=('a','b','c')
strList2=(1,2,3)
curs.execute(insert % (strList1 + strList2))
*我使用python3,(strList1,StrList2)对我不起作用,但你可能会略有不同。