2

我一直在尝试通过使用 List Comprehensions 将我的大部分mysqlclient执行命令转换为在一行中完成。下面的代码片段就是一个例子:

def org(conn, cursor, target_org=None, target_sid=None):
    try:
        if target_sid is not None:
            target_org = [{"sid": target_sid}]
        cursor.executemany(
            "INSERT INTO `Orgs` (`sid`) VALUES (%s);",
            [[Org['sid']] for Org in target_org])
        conn.commit()

...

但是,如果我想要一个要填充多列的 MySQL 查询,例如

"INSERT INTO `Citizens`(`Handle`,`Org`,`Role`,`Rank`,`Visibility`,`Stars`,`Type`)VALUE(%s,%s,%s,%s,%s,%s,%s)"

我如何实现一个列表理解,接收一个由列表member组成的列表,其中每个成员的数据与上面的示例一样使用 executemany 命令?

例如,要Handle仅抓取列,它看起来像

[Mem['handle'] for Mem in member]
# (cursor.executemany must always have a list as second argument)

member样本:

[{'roles': [], 'rank': 'No SCB account', 'type': 'main', 'stars': 2, 'visibility': 'visible', 'sid': 'imperium', 'handle': 'freakyeagle'}, {'roles': [], 'rank': 'Fleet Member', 'type': 'main', 'stars': 1, 'visibility': 'visible', 'sid': 'imperium', 'handle': 'cadimus'}, {'roles': [], 'rank': 'Fleet Member', 'type': 'main', 'stars': 1, 'visibility': 'visible', 'sid': 'imperium', 'handle': 'belleal'}]
4

1 回答 1

2

您可以将映射与 executemany. 插值将根据您的字典进行。由于您target_org是带有键“sid”的字典列表,因此您可以执行以下操作:

cursor.executemany( "INSERT INTO Orgs (sid) VALUES (%(sid)s);", target_org) 

我认为这也适用于您的第二个问题。

有关python db-api 中的参数,请参见:https ://www.python.org/dev/peps/pep-0249/#paramstyle

于 2015-11-06T16:11:10.377 回答