首页 > 解决方案 > 多重连接导致属性错误 SQLAlchemy

问题描述

我从 1.3.3 升级 1.1.13 的 SQLAlchemy 时遇到了一些麻烦。我有三个表定义如下:

class LAreas(DB.Model):
    __tablename__ = "l_areas"
    __table_args__ = {"schema": "ref_geo"}
    id_area = DB.Column(DB.Integer, primary_key=True)
    id_type = DB.Column(DB.Integer, ForeignKey("ref_geo.bib_areas_types.id_type"))
    area_name = DB.Column(DB.Unicode)
    area_code = DB.Column(DB.Unicode)
    geom = DB.Column(Geometry("GEOMETRY", current_app.config["LOCAL_SRID"]))
    source = DB.Column(DB.Unicode)
    geom = DB.Column(Geometry("GEOMETRY", 4326))
    area_type = DB.relationship("BibAreasTypes", lazy="select")

corSiteArea = DB.Table(
    "cor_site_area",
    DB.MetaData(schema="gn_monitoring"),
    DB.Column(
        "id_base_site",
        DB.Integer,
        ForeignKey("gn_monitoring.cor_site_application.id_base_site"),
        primary_key=True,
    ),
    DB.Column(
        "id_area", DB.Integer, ForeignKey("ref_geo.l_areas.id_area"), primary_key=True
    ),
)

corSiteModule = DB.Table(
    "cor_site_module",
    DB.MetaData(schema="gn_monitoring"),
    DB.Column(
        "id_base_site",
        DB.Integer,
        ForeignKey("gn_monitoring.cor_site_application.id_base_site"),
        primary_key=True,
    ),
    DB.Column(
        "id_module",
        DB.Integer,
        ForeignKey("gn_commons.t_modules.id_module"),
        primary_key=True,
    ),
)

然后,我编写一个带有两个连接的查询,以获取位于站点中的区域和如下所示的模块:

q = (
    DB.session.query(LAreas.area_name).distinct()
    .outerjoin(corSiteArea, LAreas.id_area == corSiteArea.c.id_area)
    .outerjoin(
        corSiteModule, corSiteModule.c.id_base_site == corSiteArea.c.id_base_site
    )
    .filter(corSiteModule.c.id_module == id_module)
)

此查询在 SQLAlchemy 1.1.13 中运行良好,但在最新版本 1.3.3 中运行良好。我有这个错误:

File "/home/theo/workspace/GN2/GeoNature/backend/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2414, in _join
    left, right, onclause, prop, create_aliases, outerjoin, full
  File "/home/theo/workspace/GN2/GeoNature/backend/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2437, in _join_left_to_right
    ) = self._join_determine_implicit_left_side(left, right, onclause)
  File "/home/theo/workspace/GN2/GeoNature/backend/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2518, in _join_determine_implicit_left_side
    self._from_obj, r_info.selectable, onclause
  File "/home/theo/workspace/GN2/GeoNature/backend/venv/lib/python3.6/site-packages/sqlalchemy/sql/util.py", line 149, in find_left_clause_to_join_from
    elif Join._can_join(f, s) or onclause is not None:
  File "/home/theo/workspace/GN2/GeoNature/backend/venv/lib/python3.6/site-packages/sqlalchemy/sql/selectable.py", line 957, in _can_join
    consider_as_foreign_keys=consider_as_foreign_keys,
  File "/home/theo/workspace/GN2/GeoNature/backend/venv/lib/python3.6/site-packages/sqlalchemy/sql/selectable.py", line 982, in _joincond_scan_left_right
    if nrte.table_name == left.name:
AttributeError: '_ORMJoin' object has no attribute 'name'

有什么帮助吗?

谢谢

标签: pythonsqlalchemy

解决方案


推荐阅读