【问题标题】:MySQL not accepting executemany() INSERT, running Python from Excel (datanitro)MySQL 不接受 executemany() INSERT,从 Excel (datanitro) 运行 Python
【发布时间】:2013-05-27 04:11:23
【问题描述】:

我已经添加了我自己的答案,该答案可行但有待改进

在看到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, 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

【问题讨论】:

  • 你能修复代码中的缩进吗?

标签: python mysql excel python-2.7 datanitro


【解决方案1】:

这是你的问题:

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

您的第一个 id 是 0,因此在循环的第一次迭代中,data[0] 将是错误的并且您的循环将退出,而不会添加任何数据。你可能会提到:

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

【讨论】:

  • 您可能正在考虑另一种语言(Null 不在 Python 中)。但是,如果您查看我帖子的底部,我可以使用“!= None”做类似的事情,并且实际上在我的项目中将其更改为“不是 None”。我可能会花更多时间进行改进,因为它是针对大量数据的,而我发布的数据会创建多个查询。
  • 是的,你说得对,我提醒None。当您在编写 java 代码时回答 python 问题时会发生... :)
【解决方案2】:

我最终找到了一个解决方案,它可以让我在 new 上插入并允许更新已更改的内容。不完全是基于单个查询的 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()

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 2018-12-16
    • 2020-03-28
    • 2010-09-28
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多