一尘不染

SQLAlchemy是否具有与Django的get_or_create等效的功能?

django

我想从数据库中获取一个对象(如果已存在)(基于提供的参数),或者如果不存在则创建它。

Django的get_or_create(或source)做到了。SQLAlchemy中是否有等效的快捷方式?

我目前正在像这样明确地写出来:

def get_or_create_instrument(session, serial_number):
    instrument = session.query(Instrument).filter_by(serial_number=serial_number).first()
    if instrument:
        return instrument
    else:
        instrument = Instrument(serial_number)
        session.add(instrument)
        return instrument

阅读 389

收藏
2020-03-26

共2个答案

一尘不染

基本上就是这样做的方法,没有快捷方式可供使用的AFAIK。

你可以将其概括为:

def get_or_create(session, model, defaults=None, **kwargs):
    instance = session.query(model).filter_by(**kwargs).first()
    if instance:
        return instance, False
    else:
        params = dict((k, v) for k, v in kwargs.iteritems() if not isinstance(v, ClauseElement))
        params.update(defaults or {})
        instance = model(**params)
        session.add(instance)
        return instance, True
2020-03-26
一尘不染

在@WoLpH解决方案之后,这是对我有用的代码(简单版本):

def get_or_create(session, model, **kwargs):
    instance = session.query(model).filter_by(**kwargs).first()
    if instance:
        return instance
    else:
        instance = model(**kwargs)
        session.add(instance)
        session.commit()
        return instance

这样,我就可以get_or_create我的模型的任何对象。

假设我的模型对象是:

class Country(Base):
    __tablename__ = 'countries'
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)

要获取或创建我的对象,我写:

myCountry = get_or_create(session, Country, name=countryName)
2020-03-26