Я хочу написать скрипт на Python, который создает таблицу PostgreSQL из CSV.Вместо использования psycopg2.copy_from
я хочу что-то более личное и более гибкое.
Очевидно, я собираюсь прочитать первую строку файла CSV и получить из него список имен столбцов.Затем я хочу преобразовать этот список в список столбцов, который вы будете писать при создании таблицы в postgreSQL:
"column_name_1" text,
"column_name_2" text,
"column_name_3" text,
...
"column_name_N" text
(по умолчанию я хочу, чтобы все мои столбцы имели тип text; я могу изменитьэти типы позже).Обратите внимание, что Я хочу, чтобы двойные кавычки вокруг имен столбцов появлялись , поскольку в именах этих столбцов могут быть пробелы или символы с акцентом.
Я пытался использовать psycopg2.sql.Identifier
для размещения двойных кавычекмои имена столбцов, но это не удается, так как я хочу объединить эти идентификаторы с «текстом» ...
Вот что я пробовал до сих пор:
import psycopg2
import csv
conn = psycopg2.connect(
dbname = "spatialDB",host="localhost",
port = 5432, user = "postgres",
password="postgres"
)
cur = conn.cursor()
FileName = "csv_to_import.csv"
file = open(FileName,'r',encoding='utf-8')
reader = csv.reader(file,delimiter=";")
columns = next(reader)
# The line below is what I wanted to do, but you cannot concatenate
# an SQL identifier with a string
#column_types = [psycopg2.sql.Identifier(c) + " text" for c in colums]
# This is what I did instead but it's ugly
column_types = ["\"" + c + "\" text" for c in columns]
schema = "myschema"
table_name = "import_csv_python"
model_query = "CREATE TABLE {0}.{1}({2});"
column_list = ",".join(column_types)
query = model_query.format(schema,table_name,column_list)
cur.execute(query)
file.close()
cur.close()
conn.commit()
Как бы вы исправили этот кодзаставить его использовать функцию psycopg2.sql.Identifier, чтобы правильно указывать имена столбцов? (тот же вопрос касается параметров {0} и {1}, которые являются соответственно схемой и именем таблицы)