Psycopg2 вставить заявление со списками - PullRequest
0 голосов
/ 06 января 2020

Я просматривал эту документацию для psycopg2: http://initd.org/psycopg/docs/usage.html После этой документации какое из этих утверждений вставки будет считаться правильным?

  1. cur.execute ('INSERT INTO tb VALUES (%s, %s)', row[0:2])

  2. cur.execute ('INSERT INTO tb VALUES (%s, %s)', (row[0:2]) )

, где "row" - это список, скажем, 5 элементов, а "tb" - это таблица, содержащая 2 столбца.

1 Ответ

0 голосов
/ 06 января 2020

Это фактически одно и то же, потому что простое заключение в круглые скобки не делает его кортежем; вам также понадобится запятая, например: (row[0:2],)

In [1]: row = [1,2,3]                                                             

In [2]: row[0:2]                                                                  
Out[2]: [1, 2]

In [3]: (row[0:2])                                                                
Out[3]: [1, 2]

In [4]: (row[0:2],)                                                               
Out[4]: ([1, 2],)

Но чтобы ответить на вопрос, я думаю, вы хотели бы задать: в соответствии с документацией DB-API для .execute() первая альтернатива верна: «Параметры могут быть представлены как sequence или mapping ...»

cur.execute('INSERT INTO tb VALUES (%s, %s);', row[0:2])

Другими словами, вы предоставляете последовательность (список в данном случае); и не последовательность последовательности: кортеж списка, который, опять же, выглядел бы так: (row[0:2],); обратите внимание на запятую.

...