首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL不接受executemany()插入,从Excel运行Python (datanitro)

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

Stack Overflow用户
提问于 2013-05-27 04:11:23
回答 2查看 1.4K关注 0票数 2

,我添加了我自己的答案,这是可行的,但对改进开放,

达曼陀罗看了一个项目之后。我开始连接到MySQL (他们使用SQLite),并且能够从MySQL将一个小的测试表导入到MySQL中。

从Excel表格中插入新更新的数据是下一项任务,到目前为止,我可以得到一行这样的工作。

代码语言:javascript
复制
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()

...but对多行的尝试将失败。在Excel中遍历行时,我怀疑这两个问题。这是我到目前为止..。

代码语言:javascript
复制
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()

...as现在,我没有收到任何错误,但我的新行没有添加(id 3)。这就是我的表格在Excel里的样子..。

数据库拥有相同的结构,减去id 3。必须有一种更简单的方法来遍历行并为INSERT提取唯一的内容,但经过6个小时的尝试(和2本新的Python书籍)之后,我将请求帮助。

如果我跑了..。

代码语言:javascript
复制
print '[%s]' % ', '.join(map(str, updates))

代码语言:javascript
复制
print updates

我的结果是

代码语言:javascript
复制
[]

因此,这很可能一开始就不会将任何数据传递给MySQL。

最新更新和工作脚本

不完全是我想要的,但这对我有用.

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-27 18:21:05

最后,我找到了一个解决方案,为我提供了一个新的插入,并允许更新那些被更改的。不完全是基于单个查询的Python选择,但是可以。

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2013-05-27 07:06:45

这是你的问题:

代码语言:javascript
复制
while True:
    if data[0]:
        ...
    else:
        break

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

代码语言:javascript
复制
while True:
    if data[0] is not None:
        ...
    else:
        break
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16766184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档