亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

sqlalchemy @hybrid_property v @propert

sqlalchemy @hybrid_property v @propert

白板的微信 2023-09-19 17:20:03
我有一個模型(我將其用作抽象基類),它具有一些常見的方法和屬性。SQLAlchemy 允許使用 和 創建屬性和方法,@hybrid_property而且@hybrid_method標準@property, @classmethod,@staticmethod裝飾器也可以給我我想要的結果。與標準 python 裝飾器相比,使用 SQLA 裝飾器有什么優點和缺點?我什么時候應該使用或不應該使用 SQLA 裝飾器?
查看完整描述

1 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

該混合提供了一個既可以在 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)

您還可以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}))

所以這確實是一個很好的功能,但是如果你正在考慮是否需要它,那么你肯定不需要它。


查看完整回答
反對 回復 2023-09-19
  • 1 回答
  • 0 關注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號