MySQL вставка со списком

Я пытался преобразовать большинство моих команд выполнения 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'}]

1 ответ

Решение

Вы можете использовать сопоставления с executemany, Интерполяция будет работать на основе вашего словаря. Так как ваш target_org это список словаря с ключом 'sid', так что вы можете сделать что-то вроде:

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

Я думаю, что это будет работать и для вашей второй проблемы.

Смотрите: https://www.python.org/dev/peps/pep-0249/ для параметра в python db-api

Другие вопросы по тегам