2015-11-06 53 views
2

我一直试图通过使用List Comprehensions将大部分mysqlclient执行命令转换成一行。这方面的一个例子是下面的代码片段:带插入列表理解的MySQL插入

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'}] 
+1

您可以使用映射用'executemany'。为什么不这样 - > cursor.executemany(“INSERT INTO'Orgs'('sid')VALUES(%(sid)s);”,target_org) – sagarchalise

+0

@sagarchalise我刚试过,它的工作完美,谢谢。当我有多个字段时,这是否适用于我的第二个示例? –

+0

为什么你把(%(sid)s)而不是(%s)? –

回答

2

您可以使用映射与executemany。插值将基于您的字典工作。由于您的target_org是关键“SID”词典列表 所以你可以这样做:

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

我认为这会为你的第二个问题以及工作。

参见:https://www.python.org/dev/peps/pep-0249/#paramstyle的参数在Python DB-API

+0

如果在成员列表中(由字典组成),我在成员中拥有mem ['sid'] mem,但是我希望'['sid']'与组织列关联。 (%(sid)s)'或'...(%(Org)s)' –

+1

如果你的密钥是'sid',它应该是'%(sid)s' – sagarchalise

+0

好吧,知道了,现在测试它。 –