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是一种安全风险,因此请小心处理。但是看起来呢?也不能在列名中使用,请注意,在不同的数据库中“?”可能会被其他内容替换,因此请查找您正在使用的文档。