2

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

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 提取独特的内容,但是在尝试不同的东西(和 2 本新的 Python 书籍)6 小时后,我将要求帮助。

如果我跑...

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
4

2 回答 2

3

这是你的问题:

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

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

while True:
    if data[0] is not None:
        ...
    else:
        break
于 2013-05-27T07:06:45.193 回答
0

我最终找到了一个解决方案,可以让我在 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()
于 2013-05-27T18:21:05.723 回答