如何在SQLAlchemy中删除多个表

时间:2016-09-14 14:35:16

标签: python sqlalchemy

受到这个问题的启发: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 yet和str()中不存在):

for table in sqla_base.metadata.sorted_tables:
    if str(table) in self.to_delete:
        table.drop(checkfirst=True)

问题

如何以SQLAlchemy样式删除多个表,实现与上面的原始SQL代码相同?

1 个答案:

答案 0 :(得分:1)

你得到的错误非常清楚:

AttributeError: 'str' object has no attribute '__table__'

你不是在迭代Table对象,而是在表名(又名 strings !)上进行迭代,所以当然一​​个字符串没有属性__table__,所以你的语句是:

tablename.__table__.drop() or tablename.__table__.drop(engine)

错了!它应该是:

table_instance.__table__.drop() or table_instance.__table__.drop(engine)

您可以从元数据中访问表实例。看看这里:

http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.MetaData.sorted_tables

更新

无论如何drop_all()是用于在简单命令中删除所有表的方法:http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.MetaData.drop_all