sqlAlchemy: session.query(Model.column) returns false



使用 sqlalchemy 查询自引用的表,如下所示 -

district = session.query(
District._id, District.name, District.level,
District.parent, District.ordering, District.description,
functions.ST_AsGeoJSON(District.area).label('area'),....
,.... and some columns
).filter(
st_contains(
'district.area',
st_point(lat, lng)
)
).filter(
District.level == float(level)
).first()

查询可以正确执行,但对于列 District.parent,返回False而不是父 id。

以下是学区的模型类

class District(Base):
__tablename__ = 'district'
_id = Column('_id', Text, primary_key=True)
_database_id = Column('_database_id', Text, primary_key=True)
_owner_id = Column('_owner_id', Text, primary_key=True)
_created_by = Column('_created_by', Text)
_updated_by = Column('_updated_by', Text)
_access = Column('_access', JSON)
_created_at = Column('_created_at', DateTime)
_updated_at = Column('_updated_at', DateTime)
name = Column(Text, nullable=False)
level = Column(DOUBLE_PRECISION, nullable=False)
parent_id = Column(
'parent',
Text,
ForeignKey('district._id'),
)
parent = relationship(
'District',
foreign_keys='District.parent_id',
)

如果我打印查询,我会得到这样的内容 -

SELECT district._id AS district__id, district.name AS district_name, 
district.level AS district_level, district._id = district.parent AS parent, 
district.ordering AS district_ordering, district.description AS 
district_description, ST_AsGeoJSON(district.area) AS area...,......
FROM district
WHERE ST_contains(area, ST_SetSRID(ST_Point(22.2883291, 
114.14048449999996),4326)) AND district.level = %(level_1)s
LIMIT %(param_1)s

对于父字段,它给出了一些奇怪的东西 -> district._id = district.parent AS 父级

有人可以强调我在这里做错了什么吗?

在你的District类定义中,parent它不是一个Column,它是一个relationship。因此,要获得父级的_id,您必须使用:

district = session.query(
District._id, District.name, District.level,
District.parent_id, ...
)

最新更新