gpt4 book ai didi

python - SQLAlchemy中如何删除多个表

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:47 27 4
gpt4 key购买 nike

受到这个问题的启发: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 代码相同的效果?

最佳答案

你得到的错误非常清楚:

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

关于python - SQLAlchemy中如何删除多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39493174/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com