Создать список / кортеж для вставки нескольких строк одним запросом - PullRequest
0 голосов
/ 07 июня 2018

На основании вопроса "psycopg2: вставить несколько строк одним запросом" ( psycopg2: вставить несколько строк одним запросом )

От JS я получаю следующее на стороне сервера: "2,3,4 ... "

Затем на стороне сервера (python 3.6):

list_urlquery = urlquery_partition.strip().split(",")

 for i in range(len(list_urlquery)):

        list_urlquery[i] = "(" + str(list_urlquery[i]).strip() + ", '" + str(
                        file.filename).strip() + "," + str(PATH_ID).strip() + "')"

 insert_query = 'INSERT INTO tbl_ma (theid, thefilename, thepathid) VALUES %s'

 psycopg2.extras.execute_values(cursor, insert_query, list_urlquery, template=None, page_size=100)


 print (list_urlquery)

Вывод на консоль: [" (2, 'Скриншот с 2018 г.)-05-29 07-13-47.png, 1 ') "," (3,' Скриншот с 2018-05-29 07-13-47.png, 1 ') "," (4,' Скриншот с 2018-05-29 07-13-47.png, 1 ') "]

Ошибка: INSERT имеет больше выражений, чем целевых столбцов

Я прошу вас помочь мне в этом.Как я могу создать правильный список / кортеж и вставить данные в базу данных?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Согласно документу (http://initd.org/psycopg/docs/extras.html#fast-exec) он гласит: "список аргументов - последовательность последовательностей ..."

Следовательно, последовательность последовательностей == список кортежей

# creating list of tuples (sequence of sequences).
list_urlquery = urlquery_partition.strip().split(",") # list for "theid"
lst_filename = [] # list for "thefilename"
lst_pathid = [] #list for "thepathid"
lst_tpl_insertdata = [] # creating "List of Tuples == Sequence of sequences".

for i in range(len(list_urlquery)):
    lst_filename.append(str(file.filename).strip())
    lst_pathid.append(PATH_ID)

#combine all list using "zip()" for creating "List of Tuples == Sequence of sequences".
lst_tpl_insertdata = list(zip(list_urlquery,lst_filename,lst_pathid)) 

insert_query = 'INSERT INTO tbl_ma (theid, thefilename, thepathid) VALUES %s'        
psycopg2.extras.execute_values(cursor, insert_query, lst_tpl_insertdata, template=None, page_size=100)        
connection.commit()
0 голосов
/ 07 июня 2018

Можете ли вы попробовать это так:

list_urlquery[i] = """({}, '{}', '{}')""".format(str(list_urlquery[i]).strip(), str(file.filename).strip(), str(PATH_ID).strip())

Я предполагаю, что только столбец theid является целым числом.

Если pathid также int (числовой), то попробуйте ниже единицы

list_urlquery[i] = """({}, '{}', {})""".format(str(list_urlquery[i]).strip(), str(file.filename).strip(), str(PATH_ID).strip())
...