python - 如何使用 CASCADE 指令以 ORM 方式使用 SqlAlchemy 清除 PostgresDB

标签 python postgresql orm sqlalchemy

有人知道如何在不知道其结构的情况下使用 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/

相关文章:

python - 使用 Python 脚本打开特定文件类型?

postgresql - 为什么不能使用 "service postgres start"在 docker 中启动 postgres?

php - SQL_ASCII 数据库不显示特殊字符

postgresql - 减少 plpgsql 中烦人的通知

java - 通过 hibernate 获取不同的值

php - PHP ORM 的基准?或好的测试用例

python - python中用箭头增加日期不改变属性

python - 来自 python 的文件中的文本/字数计数

python - 为每个视频生成单独的 H5 文件

orm - 如果我不想在 sql 上编写查询,为什么要使用 Dapper