Вставить список в мою базу данных, используя Python - PullRequest
8 голосов
/ 29 ноября 2011

Я хочу вставить список в свою базу данных, но не могу.

Вот пример того, что мне нужно:

variable_1 = "HELLO"
variable_2 = "ADIOS"
list = [variable_1,variable_2]

INSERT INTO table VALUES ('%s') % list

Можно ли сделать что-то подобное? Могу ли я вставить список в качестве значения? Когда я пытаюсь это сделать, появляется сообщение об ошибке из-за ошибки синтаксиса MySQL

Ответы [ 3 ]

16 голосов
/ 29 ноября 2011

Ответ на ваш исходный вопрос таков: нет, вы не можете вставить такой список.

Однако, с некоторыми изменениями, вы можете заставить этот код работать, используя %r и передаваякортеж:

variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)

К сожалению, этот стиль вставки переменных делает ваш код уязвимым для атак SQL-инъекций .

Вместо этого мы рекомендуем использовать API-интерфейс DB Python и создание настраиваемой строки запроса с несколькими вопросительными знаками для вставляемых данных:

variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1,variable_2]
var_string = ', '.join('?' * len(varlist))
query_string = 'INSERT INTO table VALUES (%s);' % var_string
cursor.execute(query_string, varlist)

Пример в начале Документы SQLite3 показывает, как передавать аргументы с помощьювопросительные знаки, и это объясняет, почему они необходимы (по сути, это обеспечивает правильное цитирование ваших переменных).

4 голосов
/ 29 ноября 2011

Ваш вопрос не ясен.

Вы хотите вставить список в виде текстовой строки, разделенной запятыми, в один столбец в базе данных?Или вы хотите вставить каждый элемент в отдельный столбец?Любой возможен, но техника отличается.

Вставить разделенный запятыми список в один столбец:

 conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)])

Вставить в отдельные столбцы:

  params = ['?' for item in list]
  sql    = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params)
  conn.execute(sql, list)

при условии, что вы установили имя соединения conn.

Несколько других предложений:

  • Старайтесь избегать операторов INSERT, которые делаютне перечисляйте имена и порядок столбцов, в которые вы вставляете.Такое утверждение приводит к очень хрупкому коду;он ломается, если вы добавляете, удаляете или перемещаете столбцы в своей таблице.

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

  • Если вы вставляете в отдельные поля, и они имеют имена, такие как Word1 и Word2, это также указание на то, что вместо этого следует использовать отдельную таблицу.

  • Никогда не используйте прямую подстановку строк для создания операторов SQL.Он сломается, если одно из значений будет, например, o'clock.Он также открывает вам возможности для атак со стороны людей, использующих методы внедрения SQL.

2 голосов

Вы можете использовать json.dumps, чтобы преобразовать список в json и записать json в db.

Например:

insert table example_table(column_name) values(json.dumps(your_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...