Python MySQLdb使用字段名和值列表插入数据库
我有两份清单:Python MySQLdb使用字段名和值列表插入数据库,python,mysql,Python,Mysql,我有两份清单: list1=['a','b','c'] list2=['1','2','3'] 我正在尝试将这些字段插入到具有字段名的数据库中,如下所示: a | b | c | d | e 我目前正在尝试将这些列表作为字符串,然后简单地添加到execute中,例如,cur.execute(insert,(strList1,strList2))其中strList1和strList2只是使用以下方法形成的list1和list2字符串: strList1='' for thing in list
list1=['a','b','c']
list2=['1','2','3']
我正在尝试将这些字段插入到具有字段名的数据库中,如下所示:
a | b | c | d | e
我目前正在尝试将这些列表作为字符串,然后简单地添加到execute中,例如,cur.execute(insert,(strList1,strList2))
其中strList1
和strList2
只是使用以下方法形成的list1
和list2
字符串:
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列必须是主键,在重复条目上,如果其他字段为空,它将更新这些字段?您可以在这些列表上做一件事,使事情更简单
list1=['a','b','c']
print ",".join(list1)
#a,b,c
你的插页看起来不错。看起来批量插入是唯一的选择 不要在查询中使用%s,因为这存在安全风险。这是因为%s只是将值插入字符串,这意味着它可以是一个完整的单独查询。 在希望值的位置使用“?”,并添加第二个参数,以元组的形式执行,如下所示
curs.execute("SELECT foo FROM bar WHERE foobar = ?",(some_value,))
或者在一个稍长的例子中
execute(“更新foo SET bar=?其中foobar=?”,(第一个值,第二个值))
编辑:
希望我这次正确理解了您的需求,但遗憾的是,您不能将“?”用于表,因此您只能使用%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]
这就是准备好的报表的工作方式(简化): *语句与参数列表一起发送到数据库; *从语句缓存中检索语句,如果不存在,则准备并添加到语句缓存中; *参数的应用; *语句被执行 语句必须完整,除非参数替换为%s(或?或:parm,取决于使用的语言)。参数仅为最终的数字/字符串/日期/etc值。因此,标签或其他部件无法更换 在您的情况下,这意味着:
insert="""insert into tbl_name(%s) values(%s)"""
应该变成这样:
insert="""insert into tbl_name(a,b,c) values(%s,%s,%s)"""
若要使用参数,必须为每个项目提供“%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)对我不起作用,但您可能会有一些细微的差异。数据库语句中的参数替换必须使用真实参数(因此您不能使用由更多参数组成的参数)。在本例中,您必须首先组装完整的插入字符串,然后才能插入,或者您必须为值(%s)部分创建一个智能循环,然后在其中包含所有5个值。我正在尝试添加一行,其中包含5个字段中的3个字段,您可以假定默认值为空,你能举例说明你在回答中所说的“首先组装完整的插入字符串”是什么意思吗?这些值可以包含诸如-.()!?Etc等,但不是外来字符,但我正在尝试插入,并尝试使用列名称和值的列表,这对stackexchange来说是新的,因此我不知道是否会通知您进行编辑。不管怎样,我编辑了我的原始答案,并添加了我认为您想要的内容。如果我解释得不好,我很抱歉,但我的意思是列名在一个列表中会发生变化,表名不会发生变化。我看到了,这可能会有所帮助。`query=“INSERT INTO foobars(%s,%s,%s)value(?,,,?)%tuple(list1)db_curs.execute(query,VALUES)`请注意%s是一种安全风险,因此请小心处理。但是看起来呢?也不能在列名中使用,请注意,在不同的数据库中“?”可能会被其他内容替换,因此请查找您正在使用的文档。