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不允许我在尝试插入行时将表名作为参数传递。

理想情况下,我想使用第一种方法。任何帮助不胜感激!

SQLAlchemyMetaData对象具有它通过MetaData.tables属性保存的所有表的映射。这是:

以名称或"表键"为键的表对象的字典。

您不希望直接或通过声明性映射重新创建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)

最新更新