首页 > 解决方案 > 声明式查询中的 Python Pony ORM 单行属性

问题描述

我正在尝试在选择查询中使用单行属性。由于 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,应该可以吗?

感谢帮助!

标签: pythondatabaseponyorm

解决方案


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

理论上这是可能的,但我们需要知道每个支持的数据库的适当翻译。对于其中一些人来说,结果表达式可能看起来很复杂,就像这个答案一样

所以我怀疑我们会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所有可能的用例中添加方法要容易得多。


推荐阅读