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

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,

我添加了我自己的答案,该答案有效,但有待改进

在看了一个项目之后。我开始连接MySQL(他们使用SQLite),并且我能够从MySQL将一个小测试表导入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中的外观

数据库拥有相同的结构,减去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()