有人知道如何在不知道其结构的情况下使用 ORM 风格的 SqlAlchemy 清除所有数据库内容吗?
用户提供连接详细信息(登录名、密码、数据库名称)的问题,我们必须准备安装数据库结构。所以,我想清除给定数据库中的所有旧数据。
以前版本的列可能是在不使用关系中必要的语句(cascade="all, delete")的情况下创建的。我们也可能不知道它的结构。有没有安全的方法来删除整个数据库内容?我可以使用 DROP TABLE ... CASCADE 在原始 SQL 中执行此操作,但我需要一种 ORM 方式。
例如,由于查询中缺少 CASCADE 指令,这些行会抛出 sqlalchemy.exc.IntegrityError:
for tbl in reversed(Base.metadata.sorted_tables):
db.execute(tbl.delete())
由于查询中缺少 CASCADE 指令,该行也会抛出 sqlalchemy.exc.InternalError 。
Base.metadata.drop_all(bind=db)
这里有很多如何做到这一点的信息,但每个解决方案都取决于列关系,而这是我们未知的。 预先感谢!
最佳答案
如果您确实想仅使用 ORM 方法删除数据库中具有任意未知结构的所有表,那么您可能必须使用类似 sqlacodegen 的方法。首先生成模型代码。但是,如果您可以使用Inspector.get_sorted_table_and_fkc_names,则不需要这样做。检索表名,然后像这样删除它们:
import sqlalchemy as sa
connection_uri = "postgresql+psycopg2://scott:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a6d2cfc1c3d4e6979f948897909e889688979f9f" rel="noreferrer noopener nofollow">[email protected]</a>/mydb"
engine = sa.create_engine(connection_uri)
insp = sa.inspect(engine)
for table_entry in reversed(insp.get_sorted_table_and_fkc_names()):
table_name = table_entry[0]
if table_name:
with engine.begin() as conn:
conn.execute(sa.text(f'DROP TABLE "{table_name}"'))
关于python - 如何使用 CASCADE 指令以 ORM 方式使用 SqlAlchemy 清除 PostgresDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65054768/