MySQLdb вставляет dict в таблицу - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть ряд данных в формате dict.Есть ли простой способ вставить его в таблицу MySQL.Я знаю, что могу написать пользовательскую функцию для преобразования dict в пользовательский SQL-запрос, но я ищу более прямую альтернативу.

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Ну ... В соответствии с документацией для paramstyle:

Установите для 'format' = коды формата ANSI C printf, например '... WHERE name =% s'.Если объект сопоставления используется для conn.execute (), то интерфейс фактически использует «pyformat» = коды расширенного формата Python, например «... WHERE name =% (name) s».Однако API в настоящее время не позволяет задавать более одного стиля в paramstyle

Таким образом, это должно быть просто вопросом:

curs.execute("INSERT INTO foo (col1, col2, ...) VALUES (%(key1)s, %(key2)s, ...)", dictionary)

где key1, key2 и т. д. являются ключами из словаря.

Отказ от ответственности: я сам не пробовал:)

Редактировать:да, попробовал.Это работает.

2 голосов
/ 30 декабря 2011

MySQLDB не поставляется с чем-то, что позволяет прямую операцию, как это.Это распространенная проблема с различными ответами, в том числе с пользовательской функцией для этой цели.

По моему опыту, лучше всего прогнуться и просто написать параметризованный SQL большую часть времени.Если у вас часто происходит одно и то же, то я хотел бы включить его в служебную функцию.

ОДНАКО, если вы пишете статический SQL с использованием параметров, тогда большинство проблем безопасности и ошибок связаны сзаботятся о.Когда вы начинаете основывать свой SQL на словаре данных, поступивших откуда (?), Вы должны быть намного осторожнее.

Таким образом, ваш код, вероятно, будет более читабельным, поддерживаемым и безопасным, если вы просто будете писать запросы, правильно использовать параметры и документ.

(Примечание: некоторые сторонники ORMи т. д ... может не согласиться ... это мнение, основанное на большом опыте того, что было простым, надежным и сработало для нашей команды)

...