[英]How to have default/pre-existing rows as ready to use objects using SQLAlchemy?
I'm developing a system using SQLALchemy to persist my data.我正在开发一个使用 SQLALchemy 来保存数据的系统。 I'd like to have objects of my default rows so I could use then when creating new instances.
我想拥有我的默认行的对象,以便在创建新实例时可以使用。
This would be very good for me since some tables are supposed to have some default values.这对我来说非常好,因为有些表应该有一些默认值。 Imagine a simple relation between trow tables (order and order_status).
想象一下 trow 表(order 和 order_status)之间的简单关系。 When inserting values in order, it would be nice to have an easy way to use some of this default values already in order_status without having to query for them every time.
按顺序插入值时,最好有一种简单的方法来使用 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()
For example, I'd like to create a new instance of Order using something like:例如,我想使用以下内容创建 Order 的新实例:
order = Order(value=10, order_status=OrderStatus.FINISHED)
Instead of:代替:
finished_status = session.query(OrderStatus).filter_by(name='Finished').first()
order = Order(value=10, order_status=finished_status)
It does not need to be implemented exactly like my example, but I'd like something similar它不需要完全像我的例子一样实现,但我想要类似的东西
You should take a look at the association_proxy
: https://docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html你应该看看
association_proxy
: https : //docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html
The example pretty much fits your question.该示例非常适合您的问题。 Your
Order
could finally look somewhat like this (obviously not copy&paste'able):您的
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
In get_or_create_order_status
you probably have to go back to querying (at least initially to eg fill a cache).在
get_or_create_order_status
您可能必须返回查询(至少最初是为了例如填充缓存)。
If the OrderStatus
is actually as simple as in your question, maybe an enum
would do the trick as well.如果
OrderStatus
实际上和您的问题一样简单,也许enum
也可以解决问题。 That would obviously be much easier to manage.这显然会更容易管理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.