首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlalchemy @hybrid_property v @property,@hybrid_method v @classmethod

sqlalchemy @hybrid_property v @property,@hybrid_method v @classmethod
EN

Stack Overflow用户
提问于 2020-09-29 00:32:36
回答 1查看 5.5K关注 0票数 11

我有一个模型(我正在使用它作为一个抽象基类),它有一些常见的方法和属性。

SQLAlchemy允许使用@hybrid_property@hybrid_method创建属性和方法,但标准的@property@classmethod@staticmethod装饰器也给出了我想要的结果。

与标准python装饰器相比,使用SQLA装饰器有什么好处和缺点吗?

什么时候应该使用或不应该使用SQLA装饰器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-29 09:56:52

这种混合提供了一个既可以在Python级别也可以在SQL表达式级别上工作的表达式。

让我们看一个例子:

代码语言:javascript
复制
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装饰器?

我想当你需要的时候你会知道的。例如,您可以将它用于快速别名:

代码语言:javascript
复制
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(不重要的原因,谁和时间-只是事实)。您可以这样做,作为一个快速的解决方案:

代码语言:javascript
复制
@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}))

所以这是一个很好的特性,但是如果你在考虑你是否需要它,那么你肯定不需要它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64111320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档