如何解决sqlalchemy @hybrid_property v @ property,@ hybrid_method v @classmethod
我有一个Model(用作抽象基类),它具有一些常用的方法和属性。
SQLAlchemy允许使用@hybrid_property
和@hybrid_method
创建属性和方法,但是标准的@property
,@classmethod
,@staticmethod
装饰器也可以为我提供以下结果:米之后。
使用SQLA装饰器比使用标准python装饰器有什么优点和缺点?
我什么时候应该或不应该使用SQLA装饰器?
解决方法
Hybrid提供了一个在两个Python上都可以使用的表达式 级别以及SQL表达式级别
让我们看一个例子:
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True)
firstname = Column(String(50))
lastname = Column(String(50))
@hybrid_property
def fullname(self):
return self.firstname + ' ' + self.lastname
@property
def long_name(self):
return self.firstname + ' ' + self.lastname
session.add(User(firstname='Brendan',lastname='Simon'))
session.commit()
# error
# print(session.query(User).filter(User.long_name == 'Brendan Simon').first().id)
# works fine because @hybrid_property
print(session.query(User).filter(User.fullname == 'Brendan Simon').first().id)
您还可以使用@fullname.expression自定义SQL expression
。
我什么时候应该或不应该使用SQLA装饰器?
我想您会在需要时知道。例如,您可以将其用于快速别名:
class MetaData(Base):
__tablename__ = 'meta_data'
system_field = Column(String(20)) # a lot of calculations and processing in different places
# a lot of fields ...
有一天将system_field
分成(或将要)重命名为new_field
(无论为什么,何时何地-都是事实)。您可以执行以下操作作为快速解决方案:
@hybrid_property
def new_field(self):
return self.system_field
@new_field.setter
def new_field(self,value: str):
self.system_field = value
# data from somewhere...
# data = {'new_field': 'default',other fields...}
# will works fine + in other places will work as `system_field` with old sql queries
process_meta(MetaData(**{data}))
这确实是一个很好的功能,但是如果您正在考虑是否需要它,那么您肯定不需要它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。