【问题标题】:Splitting a SQLAlchemy hybrid field return value拆分 SQLAlchemy 混合字段返回值
【发布时间】:2022-01-05 13:19:20
【问题描述】:

我有一个针对 Postgresql 数据库运行的 SQLAlchemy 模型。在我的模型中,我有一个 invoice_number 字符串字段,如下所示:

  • 2022-01-1
  • 2022-01-10
  • ...
  • 2022-01-2
  • ...

(我希望他们排序-1, -2, ..., -10, ...

为了对此进行排序,我想要一个混合字段,将字符串作为元组返回(并正确排序),由- 分割。

在我目前的模型中(代码使用 Flask-SQLalchemy,它将 SQLalchemy 内容包装在 db 对象后面,否则相同):

class Orders(db.Model):
    invoice_number = db.Column(db.String(32), nullable=True)

    @hybrid_property
    def invoice_number_parts(self):
        return self.invoice_number.split("-")

    @invoice_number_parts.expression
    def invoice_number_parts(cls):
        from sqlalchemy import func
        return func.split(cls.invoice_number)

这给了我一个ValueError: Invalid model property name <class 'webshop.models.Orders'>.invoice_number_parts

tutorial mentions Functions,但我找不到有关 Postgresql 可用的预定义函数的文档(我认为 string_to_array function 可以做到这一点)。

我的方法完全不在此列吗?我不需要设置器,我理解 hybrid_property 是返回值,@...expression 是 SQL 生成部分。

【问题讨论】:

    标签: python python-3.x postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    相关的 Postgresql 函数是split_parts,它接受一个字符串值(列)、一个分隔符('-')和一个从 1 开始的索引作为它的参数(在 Postgresql 14 中索引可以是负数)。

    import sqlalchemy as sa
    
    class Orders(Base):
        ...
    
        @hybrid_property
        def invoice_number_parts(self):
            return self.invoice_number.split("-")
    
        @invoice_number_parts.expression
        def invoice_number_parts(cls):
            # Split by '-', get the third column and cast to an integer.
            return sa.cast(sa.func.split_part(cls.invoice_number, '-', 3), sa.Integer)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多