簡體   English   中英

如何使用 SQLAlchemy 將默認/預先存在的行作為准備使用的對象?

[英]How to have default/pre-existing rows as ready to use objects using SQLAlchemy?

我正在開發一個使用 SQLALchemy 來保存數據的系統。 我想擁有我的默認行的對象,以便在創建新實例時可以使用。

這對我來說非常好,因為有些表應該有一些默認值。 想象一下 trow 表(order 和 order_status)之間的簡單關系。 按順序插入值時,最好有一種簡單的方法來使用 order_status 中已有的一些默認值,而不必每次都查詢它們。

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker


engine = create_engine('sqlite:///:memory:')

Base = declarative_base()

class Order(Base):
    __tablename__ = 'order'

    id = Column(Integer, primary_key=True)
    order_status_id = Column(Integer, ForeignKey('order_status.id'))
    value = Column(Integer)

    order_status = relationship('OrderStatus', lazy=True, uselist=False)

class OrderStatus(Base):
    __tablename__ = 'order_status'

    id = Column(Integer, primary_key=True)
    name = Column(String(32))

Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

finished = OrderStatus(name='Finished')
session.add(finished)
session.commit()

例如,我想使用以下內容創建 Order 的新實例:

order = Order(value=10, order_status=OrderStatus.FINISHED)

代替:

finished_status = session.query(OrderStatus).filter_by(name='Finished').first()
order = Order(value=10, order_status=finished_status)

它不需要完全像我的例子一樣實現,但我想要類似的東西

你應該看看association_proxyhttps : //docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html

該示例非常適合您的問題。 您的Order最終可能看起來像這樣(顯然不能復制和粘貼):

class OrderStatus(Base):
    ...

class Order(Base):
    __tablename__ = 'order'

    id = Column(Integer, primary_key=True)
    order_status_id = Column(Integer, ForeignKey('order_status.id'))
    value = Column(Integer)

    _order_status = relationship('OrderStatus', lazy=True, uselist=False)
    order_status = association_proxy('_order_status', 'name', creator=get_or_create_order_status)

def get_or_create_order_status(name):
    # get or create a order status by name

get_or_create_order_status您可能必須返回查詢(至少最初是為了例如填充緩存)。

如果OrderStatus實際上和您的問題一樣簡單,也許enum也可以解決問題。 這顯然會更容易管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM