psycopg2: как динамически создавать таблицы и вставлять значения в postgresql db из файла Excel - PullRequest
0 голосов
/ 10 июня 2019

Я ищу создание программы, которая принимает файл 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. Любая помощь с благодарностью!

...