【问题标题】:SQLalchemy - Iterate through all mapped tablesSQLalchemy - 遍历所有映射表
【发布时间】:2017-10-26 14:25:48
【问题描述】:

我目前正在 Flask 中创建一个 Web 应用程序,并使用 SQL-alchemy(不是 Flask 版本)来处理对我的 MySQL 数据库的读写。

我有大约 15 个不同的表,每个表都映射到不同的声明类,但是该应用程序仍处于测试阶段,因此这个数字可能会增加。

我想要一种方法来遍历每个表并在每个表上运行相同的命令。这是更新功能的一部分,管理员可以在其中更改书名,此名称更改应反映在引用该书的所有其他表中。

有没有办法遍历所有 SqlAlchemy 表?

谢谢!

【问题讨论】:

    标签: python mysql python-3.x flask sqlalchemy


    【解决方案1】:

    不完全确定你想在这里实现什么,但如果你使用声明式基础,你可以尝试这样的事情:

    tables = Base.__subclasses__()
    for t in tables:
        rows = Session.query(t).all()
        for r in rows:
            ... do something ...
    

    这通过列出 Base 的子类来获取所有表。然后它依次查询每个表中的所有内容并遍历选定的行。

    但是,我不太明白您为什么要这样做。你如何描述你的问题是你应该有一个 Book 表,如果他们想参考书籍,所有其他人都链接到它。这将是关系模型,而不是在每个表中拖动有关书籍的信息并尝试像这样手动管理它们。

    【讨论】:

    • 完美 - 正是我正在寻找的,不知道有一个内置方法可以获取 Base 类的所有子类。感谢您的帮助!
    • SQLAlchemy 声明式保留了registry of mapped classes,还有Base.metadata.tables
    • @IljaEverilä 是的,在我问这个问题之前,我对 Base.metadata.tables 进行了修改,但它似乎只返回了一个实际表名的列表,这些表名与类名不同。谢谢!
    • @Hannu - 你是对的!但是你似乎高估了我的智商。尽管使用关系数据库显然是显而易见的方法,但在我的项目开始时,我不知道什么是关系数据库,所以这就是我布局架构的方式。希望在项目结束时,我将有足够的时间来纠正这些问题。谢谢!
    猜你喜欢
    • 2012-05-14
    • 2018-02-11
    • 2022-01-19
    • 2012-11-25
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多