Вставить список значений в базу данных postgres [duplicate]

Это не ошибка дизайна . Любой, кто совершает это, делает что-то неправильно.

Есть три случая, когда я вижу, где вы можете столкнуться с этой проблемой:

  1. Вы намерены изменить аргумент как сторону эффект функции. В этом случае никогда не имеет смысла иметь аргумент по умолчанию. Единственное исключение - когда вы злоупотребляете списком аргументов, чтобы иметь функциональные атрибуты, например. cache={}, и вы не должны были бы вызывать функцию с фактическим аргументом вообще.
  2. Вы намерены оставить аргумент немодифицированным, но вы случайно сделали изменить его , Это ошибка, исправьте ее.
  3. Вы намерены изменить аргумент для использования внутри функции, но не ожидали, что изменение будет доступно для просмотра вне функции. В этом случае вам нужно сделать копию аргумента, независимо от того, был ли он по умолчанию или нет!

Пример в вопросе может относиться к категории 1 или 3. Нечетно, что он изменяет переданный список и возвращает его; вы должны выбрать тот или другой.

6
задан Brendan Long 29 November 2011 в 21:08
поделиться

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 ] показывает, как передавать аргументы с помощью вопросительных знаков, и объясняет, почему они необходимы (по существу, он обеспечивает правильное цитирование ваших переменных).

12
ответ дан Raymond Hettinger 21 August 2018 в 01:27
поделиться

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

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

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

 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)

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

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

  • Старайтесь избегать INSERT, которые не перечисляют имена и порядок столбцов, в которые вы вставляете. Такое утверждение приводит к очень хрупкому коду; он разбивается, если вы добавляете, удаляете или перемещаете столбцы в своей таблице.
  • Если вы вставляете список разделенных запятыми в одно поле, это обычно нарушает принципы проектирования базы данных, и вы должны использовать отдельную таблицу с одним значением для каждой записи.
  • Если вы вставляете в отдельные поля и у них есть имена, такие как Word1 и Word2, это также указывает на то, что вместо этого вы должны использовать отдельную таблицу.
  • Никогда не используйте прямую подстановку строк для создания операторов SQL. Он сломается, если одно из значений, например o'clock. Это также открывает вам атаки людей, использующих методы SQL-инъекций.
4
ответ дан Larry Lustig 21 August 2018 в 01:27
поделиться
  • 1
    HI Larry .... Я хочу вставить две разные строки в один и тот же столбец .... поэтому, когда я делаю запрос, чтобы получить то, что находится внутри этого colum .... Я знаю, что есть две разные строки .... . Поэтому я пытаюсь вставить значение в виде списка – mauguerra 29 November 2011 в 21:17
  • 2
    Вы не можете сделать это. Столбец может содержать только одну строку. У вас может быть запятая в этой строке, чтобы она выглядела как две разные строки, но, очевидно, это не работает, если одна из строк уже имеет запятую. Но вы должны искать идею нормализации базы данных и перепроектировать вашу базу данных, чтобы использовать отдельную связанную таблицу для хранения этих значений. Никогда, никогда, никогда не добавляйте более одного значения в столбец базы данных. – Larry Lustig 29 November 2011 в 22:21

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

Например:

insert table example_table(column_name) values(json.dumps(your_list))
1
ответ дан tsleyson 21 August 2018 в 01:27
поделиться
  • 1
    Этот пример очень запутан. Вы не можете использовать функцию Python, такую ​​как json.dumps, внутри вашей строки SQL. Сначала вам нужно будет вызвать json.dumps, а затем использовать один из методов подстановки параметров, предложенный в других ответах, чтобы передать полученную строку JSON в качестве параметра. Также не рекомендуется хранить строки JSON в столбце базы данных. – tsleyson 18 October 2017 в 23:37
Другие вопросы по тегам:

Похожие вопросы: