繁体   English   中英

sqlalchemy 自引用中的 column_property

[英]sqlalchemy column_property in self-referential

我无法描述列“invited_name”(column_property)。 我不知道如何正确地做到这一点。

class Worker(declarative_base()):
    __tablename__ = "staff_worker_info"

    id = Column(Integer, primary_key=True)
    first_name = Column(String(40), nullable=False)
    last_name = Column(String(40), nullable=False)

    invited_id = Column(Integer, ForeignKey('staff_worker_info.id'))
    invited = relationship("Worker", uselist=False, remote_side=[id], join_depth=1)

    # I don't know how to describe this column
    invited_name = column_property(
         select([Worker.first_name]). \
         where(Worker.id == invited_id).\
         label('invited_n'))

我明白为什么这不起作用,但我不知道如何以不同的方式编写它。

我应该得到这样一个 SQL 查询。

SELECT staff_worker_info.id, staff_worker_info.first_name staff_worker_info.last_name, staff_worker_info.invited_id,
        (SELECT worker_invited.first_name  
         FROM staff_worker_info AS worker_invited
         WHERE staff_worker_info.invited_id = worker_invited.id) AS invited_n,
FROM staff_worker_info 

可能有点晚了,但我最近遇到了类似的问题。 我认为您的问题仅通过关系很容易解决。 如果你愿意,你也可以使用column_property来解决它。

第一,利用关系。 如果您使受邀关系加入,那么发送到数据库的实际查询是自加入。 您可以通过该关系访问名字(参考https://docs.sqlalchemy.org/en/14/orm/self_referential.html )。

class Worker(declarative_base()):
    __tablename__ = "staff_worker_info"

    id = Column(Integer, primary_key=True)
    first_name = Column(String(40), nullable=False)
    last_name = Column(String(40), nullable=False)

    invited_id = Column(Integer, ForeignKey('staff_worker_info.id'))
    invited = relationship("Worker", uselist=False, remote_side=[id], join_depth=1, lazy='joined')
    
    @property
    def invited_name(self):
        return self.invited.first_name

然后,如果你想做的查询比较复杂,它需要你创建一个column_property ,你也可以这样做(参考https://docs.sqlalchemy.org/en/14/orm/mapped_sql_expr.html ):

from sqlalchemy import inspect
from sqlalchemy.orm import aliased

class Worker(declarative_base()):
    __tablename__ = "staff_worker_info"

    id = Column(Integer, primary_key=True)
    first_name = Column(String(40), nullable=False)
    last_name = Column(String(40), nullable=False)

    invited_id = Column(Integer, ForeignKey('staff_worker_info.id'))
    invited = relationship("Worker", uselist=False, remote_side=[id], join_depth=1)

# Requires alias
worker = aliased(Worker)
inspect(Worker).add_property(
   "invited_name",
   column_property(
         select([worker.first_name]). \
         where(worker.id == Worker.invited_id)
   )
)

我找到了一个方法。 但他不喜欢。

invited_name = column_property(
        select([text("invited_table.first_name")]).
            where(text("invited_table.id = staff_worker_info.invited_id")).
            select_from(text("staff_worker_info AS invited_table")).
            label('invited_n'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM