拆分 SQLAlchemy 混合字段 return 值

Splitting a SQLAlchemy hybrid field return value

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

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

为了对此进行排序,我想要一个混合字段 returns(并正确排序)字符串作为元组,由 -.

分割

到目前为止我的模型中有(代码使用 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 but I cannot find the documentation for what predefined functions are available for Postgresql (I presume this would be possible with the string_to_array function).

我的方法完全偏离这里了吗?为此,我不需要 setter,我将 hybrid_property 理解为返回值,将 @...expression 理解为 SQL 生成部分。

相关的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)