Как вставить строки данных csv с соответствующими именами столбцов в таблицу PostgreSQL?

#python-3.x #postgresql #psycopg2 #qgis #pyqgis

Вопрос:

Я пишу код для копирования строк соответствующих столбцов из CSV в таблицу PostgreSQL. Я использую python и qgis для того же самого.Код выглядит следующим образом

     connection=psycopg2.connect(host=host, port=port, dbname=dbname, user=name_user, password=password)        
    cursor = connection.cursor ()        
    cursor.execute("""SELECT Count(*) FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'table'""")
    csv1 = pd.read_csv(self.dlg.lineEdit_5.text())
    csvfile = open(self.dlg.lineEdit_5.text(),'r')
    columnnames = csv1.columns.values
  
    table=self.dlg.comboBox.currentText()
    table_name = table.strip(' ' ' ')
    self.dlg.lineEdit_6.setText(str(table))
    with open(self.dlg.lineEdit_5.text(), 'r') as f:
        reader = csv.reader(f)
        next(reader) # This skips the 1st row which is the header.
          
        for x in columnnames:
            column = x.strip(' ' ' ')
            #self.dlg.lineEdit_6.setText(str(column))
            sql_insert = """INSERT INTO table_name(x) VALUES(%s)"""
            for record in reader:
                cursor.execute(sql_insert,[record])
                connection.commit()
 

Я получаю следующую ошибку

         psycopg2.errors.UndefinedTable: relation "table_name" does not exist
         LINE 1: INSERT INTO table_name(x) VALUES(ARRAY['501','mah','A'])
 

Как устранить эту ошибку?. имя таблицы существует в базе данных.

Комментарии:

1. 1) В первой части у вас есть TABLE_NAME = 'table' and in the second имя таблицы’. Я знаю, что это вымышленные имена, но все же они должны быть последовательными. 2) Каково фактическое имя таблицы в базе данных? Я подозреваю, что: а) Оно смешанное или в верхнем регистре, и вам нужно будет дважды процитировать его в запросе, например, «имя_таблицы». b) Путь поиска таков, что для поиска имени таблицы необходимо указать схему.

2. Имя таблицы @AdrianKlaver написано только в нижнем регистре, оно берется из текста комбинированного поля с помощью table=self.dlg.ComboBox.currentText(). Я тоже пробовал двойные кавычки, но это дает ту же ошибку.

Ответ №1:

Это была глупая ошибка. Я брал имя таблицы из переменной в коде python. итак, запрос нужно написать следующим образом.

     table=self.dlg.comboBox.currentText()
    table_name = table.strip(' ' ' ') 
    sql_insert = """INSERT INTO %(table_name)s (x) VALUES(%s);""" 
      cursor.execute(sql_insert,[value])         
      connection.commit()