猿问

SQLAlchemy是否有相当于Django的get_or_create?

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


Django get_or_create(或来源)这样做。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


慕无忌1623718
浏览 1344回答 3
3回答

一只斗牛犬

这基本上是这样做的方式,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

慕森王

根据@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)
随时随地看视频慕课网APP
我要回答