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()