我有一个表,该表的名称必须动态创建。表格的创建方式如下:
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不允许我将表名作为参数传递。
理想情况下,我想使用第一种方法。任何帮助表示赞赏!
答案 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)