Intereting Posts
PostgreSQL ВЫБЕРИТЕ последний заказ на каждого пользователя в диапазоне дат Поиск лучшего способа использования ExecuteScalar () У баз данных, кроме Postgres, есть функции, сопоставимые с внешними обертками данных? Подсчитайте количество вхождений строки в поле VARCHAR? Как работает GROUP BY? mysql с использованием пользовательской переменной в where where Почему Index не используется с подзапросом Объединение последовательных диапазонов дат Разница в производительности между глобальным подключением к базе данных и открытием соединения каждый раз на Golang Обработка одиночной кавычки в строке SQL Получить дату создания индекса с SQL-сервера MySQL: транзакции против таблиц блокировки SQL обновляет несколько записей с разными параметрами или значениями Как выполнить SQL Insert или Replace как операцию без изменения первичного ключа? if-elseif-else 'condition' в oracle SQL

Каков наиболее эффективный способ вставки словарей / списков Python в базу данных SQL?

Представьте, что у вас есть словарь Python с ключевыми значениями (или список) с большим количеством элементов. Допустим, вы читаете более крупный файл JSON и хотите сохранить его содержимое в таблице MySQL с ключами как имена столбцов и значений в качестве самих значений.

Пример JSON:

"display_location": { "city":"Bratislava", "state_name":"Slovakia", "country_iso3166":"SK", "latitude":"48.20000076", "longitude":"17.20000076", } 

Тогда довольно неэффективно написать SQL-вставку так:

 INSERT INTO TABLE (city, state_name, country_iso3166, latitude, longitude) VALUES('%s','%s','%s','%s','%s') % (Bratislava, Slovakia, SK, 48.20000076, 17.20000076); 

(Ну, это нормально с пятью значениями, но представьте, например, пятьсот из них).

Есть ли класс / метод Python для эффективной и короткоструйной вставки SQL? Я написал этот фрагмент кода:

 for key,value in list.iteritems(): value_type = type(value) if value_type is unicode: vars_to_sql.append(value.encode('ascii', 'ignore')) keys_to_sql.append(key.encode('ascii', 'ignore')) else: vars_to_sql.append(value) keys_to_sql.append(key) keys_to_sql = ', '.join(keys_to_sql) 

После этого вставка выглядит намного проще:

 INSERT INTO conditions_bratislava(%s) VALUES %r" % (keys_to_sql, tuple(vars_to_sql),) 

Там могут быть тысячи значений, и вы все равно будете в порядке с этой одной вставкой.

Обратите внимание, что условие, которое будет декодировать строки Unicode, так что вы не будете иметь буквы «u» перед каждым значением.

Итак, есть ли более эффективный и подготовленный класс или метод, как вставлять многие значения в один и тот же простой подход с короткой строкой INSERT?

Если ваши данные структурированы таким образом, это будет больше привязываться к базе данных, ориентированной на документ (Mongo / Couch и т. Д.)

Вы можете уйти с чем-то вроде этого … Я думаю, что использование repr является слишком умным …

 insert_sql = 'INSERT INTO conditions_bratislava(%s) values(%s)' cols = ', '.join(somedict) vals = ', '.join('?' * len(somedict)) # or whatever qparam is required to_execute = insert_sql % (cols, vals) some_cursor.execute(to_execute, somedict.values()) 

На стороне примечание:

 value_type = type(value) if value_type is unicode: 

Должен быть написан как:

 if isinstance(value, unicode):