Каков наиболее эффективный способ вставки словарей/списков 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?

Ответ 1

Если ваши данные структурированы таким образом, это будет больше привязываться к базе данных, ориентированной на документ (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):