【发布时间】:2021-08-20 14:09:15
【问题描述】:
受这个问题的启发:How to delete a table in SQLAlchemy?,我最终得到了一个问题:如何删除多个表。
假设我有 3 个表,如下所示,我想删除 2 个表(想象更多表,因此无需手动删除表)。
表格
import sqlalchemy as sqla
import sqlalchemy.ext.declarative as sqld
import sqlalchemy.orm as sqlo
sqla_base = sqld.declarative_base()
class name(sqla_base):
__tablename__ = 'name'
id = sqla.Column(sqla.Integer, primary_key=True)
name = sqla.Column(sqla.String)
class job(sqla_base):
__tablename__ = 'job'
id = sqla.Column(sqla.Integer, primary_key=True)
group = sqla.Column(sqla.String)
class company(sqla_base):
__tablename__ = 'company'
id = sqla.Column(sqla.Integer, primary_key=True)
company = sqla.Column(sqla.String)
engine = sqla.create_engine("sqlite:///test.db", echo=True)
sqla_base.metadata.bind = engine
# Tables I want to delete
to_delete = ['job', 'function']
# Get all tables in the database
for table in engine.table_names():
# Delete only the tables in the delete list
if table in to_delete:
sql = sqla.text("DROP TABLE IF EXISTS {}".format(table))
engine.execute(sql)
# Making new tables now the old ones are deleted
sqla_base.metadata.create_all(engine)
如何在 SQLAlchemy 中使用?编辑
这可行,但是我想知道是否可以在 SQLAlchemy 样式中执行相同的操作,而不是使用 sqla.text("DROP TABLE IF EXISTS {}".format(table)) 执行原始 SQL 代码(不使用 sqla_base.metadata.drop_all(),因为这会删除所有表)。
我知道函数 tablename.__table__.drop() 或 tablename.__table__.drop(engine) 存在,但我不想为每个表手动键入它。
根据@daveoncode 给出的答案,以下代码可以满足我的要求(编辑2:添加checkfirst=True,以防它在db 和str() 中尚不存在):
for table in sqla_base.metadata.sorted_tables:
if str(table) in self.to_delete:
table.drop(checkfirst=True)
问题
如何以 SQLAlchemy 样式删除多个表,实现与上面的原始 SQL 代码相同的效果?
【问题讨论】:
标签: python sqlalchemy