Я ищу создание программы, которая принимает файл Excel с несколькими листами и динамически создает таблицы Postgresql для каждой из рабочих таблиц, а также обновляет базу данных, вставляя соответствующие значения из файла Excel.
Я использую pyexcel_xls
для чтения файла Excel и psycopg2
для связи с моей БД. Моя самая большая проблема - это возможность правильно формировать запросы, которые psycopg2
будет принимать, я прошел через это -> http://initd.org/psycopg/docs/sql.html, чтобы динамически создавать запросы SQL, но все еще возникают ошибки.
Ниже вы можете видеть, что я читаю файл, получаю имена столбцов и пытаюсь создать новую таблицу для каждого из этих листов Excel, а также вставляю значения ячеек из каждого столбца в их соответствующие таблицы.
Использование psycopg
базовых манипуляций со строками с использованием %s
не работает, поскольку имена таблиц / столбцов должны динамически извлекаться из файла, предоставленного пользователем.
dataset = pyxl.get_data(infile)
conn = connect("dbname=test user=user")
cur = conn.cursor()
tables = dataset.keys()
for table in tables:
col_names = dataset[table][0]
table_values = dataset[table]
# Execute a command: this creates a new table
snip = sql.SQL(', ').join(sql.Identifier(n) for n in col_names)
createsqltable = sql.SQL("CREATE TABLE {} (id serial PRIMARY KEY, {} VARCHAR(250))")
.format(sql.Identifier(table), snip)
cur.execute(createsqltable)
table_values.pop(0)
# Insert cell values into created tables
for row in table_values:
vals = sql.SQL(', ').join(sql.Identifier(n) for n in row)
insert_sql = sql.SQL("INSERT INTO {} VALUES ({})").format(sql.Identifier(table), vals).as_string(conn)
print insert_sql
cur.execute(insert_sql)
В настоящее время выводится код:
raise TypeError("SQL identifier parts must be strings")
TypeError: SQL identifier parts must be strings
в запросе CREATE TABLE
, потому что я считаю, что snip
сверху имеет тип sql.SQL
, что psycopg2
называет Composable
.
Я застрял в этой проблеме уже несколько дней и до сих пор не смог найти существующие документы / проблемы, которые правильно построят SQL-запрос, используя psycopg2.sql
, который предлагает psycopg2
. Любая помощь с благодарностью!