我想从数据库中获取一个对象(如果已存在)(基于提供的参数),或者如果不存在则创建它。
Django的get_or_create(或source)做到了。SQLAlchemy中是否有等效的快捷方式?
get_or_create
source
我目前正在像这样明确地写出来:
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
基本上就是这样做的方法,没有快捷方式可供使用的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)