1

我正在尝试使用 pymysql 在 mysql 表中插入一些数据,但失败了。数据已经保存在变量中,所以我需要将它们传递给 INSERT 语句。

这就是我目前正在尝试的......

con = pymysql.connect(host='*.*.*.*', port=***, user='****', 
passwd='***', db='****')
with con:
    cur = con.cursor()
    sql = ("INSERT INTO groupMembers (groupID, members) VALUES (%s, %s)")
    data = (groupID, (x for x in membersList))
    cur.executemany(sql, data)
    con.commit()
    con.close()

我试图传递的数据如下所示....

groupID = G9gh472

membersList = [戴夫,鲍勃,迈克,比尔,科林]

列表的长度是未知的,并且可以改变我想要看起来像这样的结果表......

| groupID | members |
+---------+---------+
| G9gh472 | Dave    |
| G9gh472 | Bob     |
| G9gh472 | Mike    |
| G9gh472 | Bill    |
| G9gh472 | Colin   |

根据阅读其他答案,我已经尝试了一些变体,但到目前为止我没有尝试过任何工作。谢谢大家

4

2 回答 2

4

根据 pymysql 文档,executemany 函数需要一个序列序列或数据映射。

你可以做

data = list([(groupID, x) for x in membersList]) # Create a list of tuples

这应该可以解决问题。这是更新的代码片段-

con = pymysql.connect(host='*.*.*.*', port=***, user='****', 
passwd='***', db='****')
with con:
    cur = con.cursor()
    sql = ("INSERT INTO groupMembers (groupID, members) VALUES (%s, %s)")
    data = list([(groupID, x) for x in membersList]) # Create a list of tuples
    cur.executemany(sql, data)
    con.commit()
    con.close()
于 2019-07-21T12:12:27.740 回答
3

您传递给executemany函数的数据变量是一个元组,但函数需要一个序列/映射。 cursor.executemany(operation, seq_of_params)是函数签名。这就是您的代码不起作用的原因。

产生序列的一种方法如下。

product(x,y) returns ((x,y) for x in A for y in B)

product([groupId], members)返回一个元组的元组(一个序列)。

你可以参考下面的代码——

import itertools

    with con.cursor() as cur: # a good practice to follow
        sql = ("INSERT INTO test (id, memb) VALUES (%s, %s)")
        cur.executemany(sql, itertools.product([groupId], members)) # the change needed
    con.commit()
于 2019-07-20T19:20:00.303 回答