【问题标题】:How to clear PostgresDB with SqlAlchemy in ORM way using CASCADE instruction如何使用 CASCADE 指令以 ORM 方式使用 SqlAlchemy 清除 PostgresDB
【发布时间】:2021-03-11 06:22:05
【问题描述】:

有人知道如何在不知道其结构的情况下使用 SqlAlchemy 以 ORM 样式清除所有数据库内容吗?

用户提供连接详细信息(登录名、psw、数据库名称)的问题,我们必须准备安装我们的数据库结构。所以,我想清除给定数据库中的所有旧数据。

可以在不使用关系中的必要语句 (cascade="all, delete") 的情况下创建以前版本的列。它的结构也可能不为我们所知。有什么安全的方法可以删除整个数据库内容吗?我可以在原始 SQL 中执行此操作,使用 DROP TABLE ... CASCADE,但我需要 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)

这里有很多关于如何做到这一点的信息,但每个解决方案都取决于我们不知道的列关系。 提前致谢!

【问题讨论】:

    标签: python postgresql orm sqlalchemy


    【解决方案1】:

    如果您真的想使用 just ORM 方法删除数据库中具有任意未知结构的所有表,那么您可能必须先使用sqlacodegen 之类的东西来生成模型代码。但是,如果您可以使用 Inspector.get_sorted_table_and_fkc_names 检索表名,然后像这样删除它们,则不需要这样做:

    import sqlalchemy as sa
    
    connection_uri = "postgresql+psycopg2://scott:tiger@192.168.0.199/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}"'))
    

    【讨论】:

    • 谢谢,如果没有 sqlacodegen 或类似的插件,似乎描述的任务是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2018-04-22
    • 2017-06-04
    • 2011-06-27
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多