【发布时间】:2020-10-20 07:54:44
【问题描述】:
我正在构建一个 fastAPI 应用程序,并且我有一个复杂的查询,我试图避免将其作为多个单独的查询来连接结果。 我有以下所有表都有外键:
CHANGE_LOG:change_id | original (FK ROSTER.shift_id) | new (FK ROSTER.shift_id) | change_type (FK CONFIG_CHANGE_TYPES)
名册:shift_id | shift_type (FK CONFIG_SHIFT_TYPES) | shift_start | shift_end | user_id (FK USERS)
CONFIG_CHANGE_TYPES:change_type_id | change_type_name
CONFIG_SHIFT_TYPES:shift_type_id | shift_type_name
用户:user_id | user_name
FK= 外键
我需要返回以下信息:
user_name、change_type_name 和 shift_start shift_end 和 shift_type_name 用于那些 shift_id 与 CHANGE_LOG 行中的原始或新的匹配。
问题是 CHANGE_LOG 表可能既有原始的也有新的,只有原始的但没有新的,或者只有新的但没有原始的。但是由于用户可以在提交请求之前从下拉框中选择一些选项,因此我还需要能够包含一个过滤器来挑出:
- 只有一个用户,或所有用户
- 任何change_type,或一组change_types
问题是我无法找到一种方法来保证每一行的用户名而不事后检查,因为我不知道新的或原始的是否存在或设置为null。
SQLalchemy 中是否有一种方法可以在查询中使用可选过滤器,我可以说如果原始存在使用它来获取 user_id,但如果不存在则使用新的来获取 user_id。 另外,如果我有一个查询肯定会找到那些具有原始和新班次的人,它永远不会找到那些只有其中一个班次的人,因为条件永远不会匹配。
我也读过this 和类似的,虽然他们会解决有条件地设置一些过滤器的问题,但它并没有解决部分空值根本不返回任何内容的问题,而不是一半数据。 This 似乎可以解决这个问题,但我不知道如何实现它。
我知道这很复杂,所以如果我在解释问题方面做得不好,请告诉我。
【问题讨论】:
-
我认为这可以/将使用
outerjoin解决,但弄清楚语法是一件很痛苦的事情。有任何指向 5 表的指针加入吗?
标签: python-3.x sqlalchemy fastapi