gpt4 book ai didi

python - sqlalchemy @hybrid_property v @property,@hybrid_method v @classmethod

转载 作者:行者123 更新时间:2023-12-04 03:53:25 26 4
gpt4 key购买 nike

我有一个模型(我将其用作抽象基类),它具有一些常见的方法和属性。
SQLAlchemy 允许使用 @hybrid_property 创建属性和方法和 @hybrid_method ,也是标准@property , @classmethod , @staticmethod装饰师给我我想要的结果。
与标准 python 装饰器相比,使用 SQLA 装饰器有什么优点和缺点吗?
我什么时候应该使用,或者不应该使用 SQLA 装饰器?

最佳答案

The hybrid provides for an expression that works at both the Pythonlevel as well as at the SQL expression level


让我们看一个例子:
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)
您也可以定制 SQL expression使用 @fullname.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}))
所以这是一个非常好的功能,但是如果您正在考虑是否需要它,那么您肯定不需要它。

关于python - sqlalchemy @hybrid_property v @property,@hybrid_method v @classmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64111320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com