在SQLAlchemy中使用可变列标题

时间:2018-11-19 03:20:46

标签: python sqlalchemy

我正在尝试从psycopg2迁移到SQLAlchemy。在代码的一点上,我在 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 :(得分:1)

使用此示例数据:

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) )