SQLAlchemy:使用动态创建的名称插入表

时间:2019-08-30 11:25:07

标签: python sqlalchemy

我有一个表,该表的名称必须动态创建。表格的创建方式如下:

def create_data_table(table_name):
    meta = Base.metadata
    my_table= Table(
        table_name, meta,
        Column('id', BigInteger, primary_key=True, nullable=False),
        Column('file_name', String(250), nullable=False)
    )
    meta.create_all(engine, [my_table])

这很好用。但是,当我插入行时,我还需要将表名作为变量传递,这就是我遇到问题的地方。

这是我尝试过的事情:

def insert_data(table_name, data):

    meta = Base.metadata
    my_table = Table(
        table_name, meta,
        Column('id', BigInteger, primary_key=True),
        Column('file_name', String(250))
    )
    conn = engine.connect()
    conn.execute(my_table.insert(), data)

这将导致错误,告诉我my_table已在我的元数据中定义。

为避免这种情况,我尝试改为创建一个类:

class my_table(Base):
    __tablename__ = ''
    id = Column('id', String(50), primary_key=True)
    file_name = Column('file_name', String(250))

    def __init__(self, table_name, id, file_name):
        __tablename__ = table_name
        self.id = id
        self.file_name = file_name

同样,我能够创建表而没有任何问题,但是当我尝试插入行时,SQLAlchemy不允许我将表名作为参数传递。

理想情况下,我想使用第一种方法。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

SQLAlchemy MetaData对象具有通过MetaData.tables属性保存的所有表的映射。就是

  

以对象名称或“表键”为键的Table对象字典。

您不想直接或通过声明性映射重新创建Table,只需从MetaData.tables中按名称访问即可。例如:

Base.metadata.tables[table_name]

您的insert_data()实现可以简单地是:

def insert_data(table_name, data):
    my_table = Base.metadata.tables[table_name]
    conn = engine.connect()
    conn.execute(my_table.insert(), data)