MySQL不接受executemany()INSERT,从Excel运行Python(datanitro)

我已经增加了自己的答案,但工作,但改善开放

在datanitro上看到一个项目后。 我接触到MySQL的连接(他们使用SQLite),我能够从MySQL中导入一个小的testing表到Excel中。

从Excel工作表中插入新的更新数据是下一个任务,到目前为止,我可以得到一行工作就像这样…

import MySQLdb db = MySQLdb.connect("xxx","xxx","xxx","xxx") c = db.cursor() c.execute("""INSERT INTO users (id, username, password, userid, fname, lname) VALUES (%s, %s, %s, %s, %s, %s);""", (Cell(5,1).value,Cell(5,2).value,Cell(5,3).value,Cell(5,4).value,Cell(5,5).value,Cell(5,6).value,)) db.commit() db.close() 

…但在多行尝试将失败。 我怀疑在遍历Excel中的行时出现问题。 这是我到目前为止…

 import MySQLdb db = MySQLdb.connect(host="xxx.com", user="xxx", passwd="xxx", db="xxx") c = db.cursor() c.execute("select * from users") usersss = c.fetchall() updates = [] row = 2 # starting row while True: data = tuple(CellRange((row,1),(row,6)).value) if data[0]: if data not in usersss: # new record updates.append(data) row += 1 else: # end of table break c.executemany("""INSERT INTO users (id, username, password, userid, fname, lname) VALUES (%s, %s, %s, %s, %s, %s)""", updates) db.commit() db.close() 

…截至目前,我没有得到任何错误,但我的新行不加(id 3)。 这是我的表在Excel中的样子…

在这里输入图像说明

数据库保持相同的结构,减去ID 3.必须有一个更简单的方式来遍历行,并为INSERT拉独特的内容,但6小时后尝试不同的事情(和2个新的Python书),我要问帮帮我。

如果我运行…

 print '[%s]' % ', '.join(map(str, updates)) 

要么

 print updates 

我的结果是

 [] 

所以这可能不会将任何数据传递给MySQL。

最新的更新和工作脚本

不完全是我想要的,但这已经为我工作…

 c = db.cursor() row = 2 while Cell(row,1).value != None: c.execute("""INSERT IGNORE INTO users (id, username, password, userid, fname, lname) VALUES (%s, %s, %s, %s, %s, %s);""", (CellRange((row,1),(row,6)).value)) row = row + 1 

这是你的问题:

 while True: if data[0]: ... else: break 

你的第一个ID是0,所以在循环的第一次迭代中, data[0]将是错误的,你的循环将会退出,而不会添加任何数据。 你可能会想要的是:

 while True: if data[0] is not None: ... else: break 

我最终find一个解决scheme,让我插入新的,并允许更新那些被更改的。 不完全是基于单个查询的Pythonselect,但会做。

 import MySQLdb db = MySQLdb.connect("xxx","xxx","xxx","xxx") c = db.cursor() row = 2 while Cell(row,1).value is not None: c.execute("INSERT INTO users (id, username, password, \ userid, fname, lname) \ VALUES (%s, %s, %s, %s, %s, %s) \ ON DUPLICATE KEY UPDATE \ id=VALUES(id), username=VALUES(username), password=VALUES(password), \ userid=VALUES(userid), fname=VALUES(fname), lname=VALUES(lname);", (CellRange((row,1),(row,6)).value)) row = row + 1 db.commit() db.close()