假设我有一个像这样的简单模型:
class Example(db.Model):
__tablename__ = 'example'
ex_seq = db.Sequence('ex_seq', metadata=db.Model.metadata)
ex_id = db.Column(db.BIGINT(), server_default=ex_seq.next_value(), primary_key=True)
_thing1 = db.Column(db.VARCHAR(255), nullable=False)
@property
def thing1(self) -> list:
"""
Mutator for thing1 to be represented as an array.
Returns:
list: The thing1 list.
"""
return self._thing1.split('|')
@thing1.setter
def thing1(self, value):
"""
Setter for thing1 to mutate an array into string.
Args:
value (list): The thing1 list.
"""
self._thing1 = "|".join(value)
thing1 = synonym('_thing1', descriptor=thing1)
以下查询将按预期生成数组:
examples = db.session.query(Example).all()
for example in examples:
print(example.thing1)
那是因为我操作的是示例类型。
但是,如果我想得到所有不同的东西1,我现在正在使用sqlalchemy.util._collections.result。
things = db.session.query(Example.thing1).distinct()
for thing in things:
print(thing.thing1)
因此上面的代码将打印出我的管道分隔列表,而不通过db.Model'示例中定义的getter函数。'我已经在SQLAlchemy文档中进行了一些挖掘,但是这个用例似乎经常不足以引出结果。我也理解我使用postgres并且可以切换到阵列类型,但它是遗留系统,此时不适合升级。关于如何在模型中强制@property声明来处理集合结果的任何想法?