Используйте переменные заголовки столбцов в SQLAlchemy - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь перейти на SQLAlchemy из psycopg2. В какой-то момент моего кода у меня есть список имен столбцов в columnList , которые будут созданы как текстовые типы в имени таблицы, хранящейся в tableName . Используя psycopg2, этот запрос работает следующим образом:

ct = 'CREATE TABLE ' + tableName + ' ( id integer PRIMARY KEY, '
for _col in columnList:
    ct += '"' + _col + '" text, '
ct = ct[:-2] + ');'
cur.execute(ct)
conn.commit()

Как мне добиться того же в SQLAlchemy, учитывая, что я не могу жестко закодировать имена столбцов или таблиц, когда они взяты из динамического списка?

Кроме того, как только эта таблица будет создана, как на нее и на столбцы ссылаться позже в коде при запросе или вставке значений?

Спасибо.

1 Ответ

0 голосов
/ 19 ноября 2018

Используя этот пример данных:

data = {'table1name': ['textcol1', 'textcol2'],
        'table2name': ['textcol3', 'textcol4']}

Вот один из способов сделать это:

from sqlalchemy import Table, Column, Text, Integer, MetaData

metadata = MetaData()

for tblname, colnames in data.items():
    Table(
        tblname, metadata,
        Column('id', Integer, primary_key=True),
        *[Column(name, Text) for name in colnames]
    )

Таблицы автоматически сопоставляются с их именами в словаре MetaData.tables ...

print(type(metadata.tables['table1name']))  # <class 'sqlalchemy.sql.schema.Table'>

... так что вы всегда можете получить к ним доступ для выполнения запросов, если у вас есть имя таблицы.

Это отобразит операторы создания таблицы:

from sqlalchemy.schema import CreateTable
for table in metadata.tables.values():
    print(CreateTable(table))

Какие отпечатки:

CREATE TABLE table1name (
        id INTEGER NOT NULL,
        textcol1 TEXT,
        textcol2 TEXT,
        PRIMARY KEY (id) )



CREATE TABLE table2name (
        id INTEGER NOT NULL,
        textcol3 TEXT,
        textcol4 TEXT,
        PRIMARY KEY (id) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...