execute中要使用对等格式 如 name(char), age(int),此时语句为: cur.execute("insert into db.table(name,age) values(%s,%d)" % (v[name], v[age]) ,v[name]为字符,v[age]为int
executemany中不需要强制格式,同上表语句为:
values=[("zhan",23),("li",33)]
executemany("insert into db.tables(name,age) values(%s,%s)",values)
具体原因我也不清楚,只能说是走过的坑吧,executemany一般只用%s即可,用其它的可能会报错。插入后的值是正常的(貌似是自动匹配列属性?),有大侠知道的也望指教
题主你好,
从你的代码来说, 你的问题出在对executemany(sql, data)这个方法的逻辑没弄明白.
咱们对比一下execute(sql)和executemany(sql, data), 这里假设sql执行的是插入 *** 作:
前者是执行单条 *** 作,要插入的数据是写死在sql这个字符串中的
后者是批量执行插入 *** 作.关键的地方在于sql参数中留出格式化字符, 而数据是从data中取,这么说不好理解,看例子吧:
sql改为:
sql = "INSERT INTO bbb(nu1, nu2, nu3) VALUES (%s, %s, %s)"
注意和你的对比一下:
sql = "INSERT INTO bbb(nu1, nu2, nu3) VALUES (%s, %s, %s)" % (aa,bb,cc)
-----
关键是data参数,有两种写法,一种是序列内嵌, 一种是字典:
序列内嵌(外层必须是列表, 内层元素是列表或元组)
data=[[1,2,3],[4,5,6],[7,8,9]]
data=[(1,2,3),(4,5,6),(7,8,9)]
字典:
使用字典时,sql也要相应的改一下:
sql = "INSERT INTO bbb(nu1, nu2, nu3) VALUES (%(nu1)s, %(nu2)s, %(nu3)s)"
data参数外层还是一个列表, 内层元素是一个个的字典,即一个字典表示一条将要被插入的数据:
data = [ { 'nu1':1, 'nu2':2, 'nu3':3 }, { 'nu1':1, 'nu2':2, 'nu3':3 } ]
-----
再说下最终的逻辑:
序列内嵌法:
1.可以使用for循环先得到一个外层是列表,内层元素是列表或元组的这的一个列表:
ll= []
for i in itertools.permutations(range(1,8),3):
ll.append(i)
2.然后再构建sql语句:
sql = "INSERT INTO bbb(nu1, nu2, nu3) VALUES (%s, %s, %s)"
3.调用executemany():
cursor.executemany(sql,ll)
4.最后调用commit(),提交给数据库执行:
yydd.commit()
-----
字典法的逻辑:
1.使用for循环构建一个元素是字典的列表:
ll= []
for i in itertools.permutations(range(1,8),3):
ll.append({'nu1':i[0], 'nu2':i[1], 'nu3':i[2]})
2.构建sql语句:
sql = "INSERT INTO bbb(nu1, nu2, nu3) VALUES (%(nu1)s, %(nu2)s, %(nu3)s)"
3,4步同序列内嵌法中的描述.
=====
希望可以帮到题主, 欢迎追问
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)