Python Pony ORM 单行 属性 内部声明式查询

Python Pony ORM one-line property inside declarative queries

我正在尝试在 select 查询中使用单行 属性。应该有可能是因为 0.7.4 & 0.7.5+ (inside value_at_end property) 等简单操作有效,但我无法使用 split() 等。关于 0.7.4 和 0.7.5 更新应该是可以的。

class Foo(db.Entity):
    _table_ = "sample_table"
    some_string_with_value_at_end = Optional(str)

    @property
    def value_at_end(self):
        return self.some_string_with_value_at_end.split('/')[-1]

    @classmethod
    def get_values_at_end(cls):
        values = select(v.value_at_end for v in cls)
        return values

items = Foo.get_values_at_end()
for each in items:
    print(each)

获取错误:

AttributeError: 'str' object has no attribute 'split': self.some_string_with_value_at_end.split (inside Foo.value_at_end)

现在我正在使用raw_sql,但想制作更多python,应该可以吗?

感谢帮助!

此时 Pony 不知道如何将 str.split 方法调用转换为 SQL。

理论上是可行的,但我们需要了解每个支持的数据库的适当翻译。对于其中一些,结果表达式可能看起来非常复杂,如 this answer

所以我怀疑我们会在不久的将来添加对 str.split 翻译的支持。也许您更容易使用 JSON 列并在其中存储字符串值数组。然后你可以写

class Foo(db.Entity):
    str_items = Optional(Json)

    @property
    def value_at_end(self):
        return self.str_items[-1]

    @classmethod
    def get_values_at_end(cls):
        values = select(v.value_at_end for v in cls)
        return values

现在使用负索引访问 JSON 数组的最后一项应该在 PostgreSQL 中工作,我认为我们也应该为其他数据库添加它,它看起来比添加容易得多str.split 具有所有可能用例的方法。