繁体   English   中英

参数化基于 ORM 的 SqlAlchemy 查询

[英]Parametrizing an ORM based SqlAlchemy query

我是 SqlAlchemy 的新手,并试图找出解决我正在尝试配置的内容的最佳方法。

我正在将 Flask/Postgresql webapp 从基本的 psycopg2 驱动程序迁移到基于 SqlALchemy ORM 的驱动程序,并且我有一个基本的 ORM 相关类设置。

假设我有一个称为event的基本级别对象。

我有多个users与此event相关联。

Event具有属性created_date_keydescription

现在,我想要实现的是,我在event查询某些内容,并自动返回额外的计算属性。 我了解如何根据我列出的三列( created_date_keydescription )创建计算属性,但我有一个额外的要求 - 不同的用户将有不同的计算值。 所以我想要一个用户特定的查询,我可以在其中将用户的 ID 传递到@property这样我就可以计算出适当的值。

所以把它放在一起,代码看起来像:

class Event(Base):
        __tablename__ = 'activity'
        _key = Column(Integer, primary_key=True)
        created_date = Column(String)
        description = Column(String)

        @property
        def calculated_attribute(self):
            # Do some lookups here based on user_id
            calculated_attr = "ResultOfLogic"
            return calculated_attr

然后执行如下操作:

作为user_id = 1

    with session_scope as session:
       session.query(Event).all()

并接收类似于此的数据:

   description: "Description"
   created_date: "1/7/2020"
   calculated_attr: "Result calculated for user 1"

user_id=2

   description: "Description"
   created_date: "1/7/2020"
   calculated_attr: "Something totally different"

我尝试在 Event 的 init 构造函数中添加 self.user_id,但似乎我们正在使用entities而不是使用 sqlalchemy 的类的实例。 我正在尝试做的甚至是可能的,还是在查询后我必须做一些手动工作来创建这些对象? 我希望能够使用 sql 也对这些属性进行排序,这是我在执行查询时尝试计算这些结果的原因之一。

对于那些来到这里寻找答案的人:

事实证明,您可以执行以下操作:

class Event(Base):
        user_id = None
        __tablename__ = 'activity'
        _key = Column(Integer, primary_key=True)
        created_date = Column(String)
        description = Column(String)

        @property
        def calculated_attribute(self):
            # Use user_id in here like self.
            return self.user_id + "Hi!"

比您的查询看起来像:

    with session_scope as session:
           Event.user_id = "Your_User_Id"
           session.query(Event).all()

暂无
暂无

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

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