MySQL不接受executemany()插入,从Excel运行Python(datanitro)
我添加了我自己的答案,该答案有效,但有待改进 在看了一个项目之后。我开始连接MySQL(他们使用SQLite),并且我能够从MySQL将一个小测试表导入Excel 从Excel工作表中插入新的更新数据是下一个任务,到目前为止,我可以让一行像这样工作MySQL不接受executemany()插入,从Excel运行Python(datanitro),python,mysql,excel,python-2.7,datanitro,Python,Mysql,Excel,Python 2.7,Datanitro,我添加了我自己的答案,该答案有效,但有待改进 在看了一个项目之后。我开始连接MySQL(他们使用SQLite),并且我能够从MySQL将一个小测试表导入Excel 从Excel工作表中插入新的更新数据是下一个任务,到目前为止,我可以让一行像这样工作 import MySQLdb db = MySQLdb.connect("xxx","xxx","xxx","xxx") c = db.cursor() c.execute("""INSERT INTO users (id, username,
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中的外观
数据库拥有相同的结构,减去ID3。必须有一种更简单的方法来遍历行并为INSERT提取唯一的内容,但是在尝试了6个小时不同的事情(以及2本新的Python书籍)之后,我将寻求帮助
如果我跑的话
print '[%s]' % ', '.join(map(str, 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,因此在循环的第一次迭代中,数据[0]
将是错误的,您的循环将退出,而不会添加任何数据。你可能会说:
while True:
if data[0] is not None:
...
else:
break
我最终找到了一个解决方案,可以让我插入新的内容,并允许更新已更改的内容。不完全是基于单个查询的Python选择,但可以
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()
您能修复代码中的缩进吗?您可能正在考虑另一种语言(Null在Python中不存在)。但是如果你查看我文章的底部,我可以使用“!=None”来做类似的事情,并在我的项目中将其改为“is not None”。我可能会花更多的时间来改进,尽管这是针对大量数据的,而且我发布的这篇文章会创建多个查询。是的,你自己是对的,我的评论
无
。当您在编写java代码时回答python问题时发生…:)
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()