[英]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_proxy
: https : //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.