Это не ошибка дизайна . Любой, кто совершает это, делает что-то неправильно.
Есть три случая, когда я вижу, где вы можете столкнуться с этой проблемой:
cache={}
, и вы не должны были бы вызывать функцию с фактическим аргументом вообще. Пример в вопросе может относиться к категории 1 или 3. Нечетно, что он изменяет переданный список и возвращает его; вы должны выбрать тот или другой.
Ответ на ваш исходный вопрос: Нет, вы не можете вставить такой список.
Однако с некоторой настройкой вы можете сделать этот код с помощью %r
и пройти в кортеж:
variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)
К сожалению, этот стиль вставки переменной оставляет ваш код уязвимым для SQL-инъекций .
Вместо этого мы рекомендуем использовать API Python DB и построение настраиваемой строки запроса с несколькими вопросительными знаками для вставленных данных:
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 ] показывает, как передавать аргументы с помощью вопросительных знаков, и объясняет, почему они необходимы (по существу, он обеспечивает правильное цитирование ваших переменных).
Ваш вопрос непонятен.
Вы хотите вставить список в виде текстовой строки с разделителями-запятыми в один столбец в базе данных? Или вы хотите вставить каждый элемент в отдельный столбец?
Вставить список с разделителями-запятыми в один столбец:
blockquote>conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)])
Вставить в отдельные столбцы:
blockquote>params = ['?' for item in list] sql = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params) conn.execute(sql, list)
, предположив, что вы установили соединение name conn.
Несколько других предложений:
- Старайтесь избегать INSERT, которые не перечисляют имена и порядок столбцов, в которые вы вставляете. Такое утверждение приводит к очень хрупкому коду; он разбивается, если вы добавляете, удаляете или перемещаете столбцы в своей таблице.
- Если вы вставляете список разделенных запятыми в одно поле, это обычно нарушает принципы проектирования базы данных, и вы должны использовать отдельную таблицу с одним значением для каждой записи.
- Если вы вставляете в отдельные поля и у них есть имена, такие как
Word1
иWord2
, это также указывает на то, что вместо этого вы должны использовать отдельную таблицу.- Никогда не используйте прямую подстановку строк для создания операторов SQL. Он сломается, если одно из значений, например
o'clock
. Это также открывает вам атаки людей, использующих методы SQL-инъекций.
Вы можете использовать json.dumps
для преобразования списка в json и записать json в db.
Например:
insert table example_table(column_name) values(json.dumps(your_list))
json.dumps
, внутри вашей строки SQL. Сначала вам нужно будет вызвать json.dumps
, а затем использовать один из методов подстановки параметров, предложенный в других ответах, чтобы передать полученную строку JSON в качестве параметра. Также не рекомендуется хранить строки JSON в столбце базы данных.
– tsleyson
18 October 2017 в 23:37