如何优雅地检查一个对象/实例/variables的存在,并同时将其分配给variables,如果它存在于Python?

我正在使用SQLAlchemy来填充数据库,并经常需要检查在处理之前数据库中是否存在orm对象。 这可能是一个非传统的问题,但我发现自己经常遇到这种模式:

my_object = session.query(SomeObject).filter(some_fiter).first() if my_object: # Mostly in databases... # Juchee it exists # process else: # It does not exist. :-( my_object = SomeObject() # process 

梦想的会是这样的:

 if my_object = session.query(someObject).blabla.first(): # if my_object is None this scope is left alone # if my_object is not None I can work with my_object here... 

我知道,这个语法是错误的,但我想解释一下,我的意思是这个例子。 任何相同的方式会让我开心。

这种模式是否有一个优雅的Python方法? 这个问题不仅针对SQLAlchemy,而且针对每个等价的场景。

闭上眼睛打“张贴你的问题”,并等待聪明的人和pythonistas心脏追捕我可能不适当的东西 😉

你想要执行Exist查询是有效的

 (ret, ), = Session.query(exists().where(SomeObject.field==value)) 

迈克·拜耳在他的博客文章中解释:
http://techspot.zzzeek.org/2008/09/09/selecting-booleans/

你可以使用标量,如果你不想有一个元组作为结果:

 ret = Session.query(exists().where(SomeObject.field==value)).scalar() 

这已经被很久以前问过了,但是对于未来的访问者来说,一个更简洁的检查方法是

  if session.query(model).filter(some_filter).count(): # do stuff 

把它包装在一个函数(从django get_or_create无耻地窃取,这不会返回一个元组虽然)

 get_or_create(model, **kwargs): try: # basically check the obj from the db, this syntax might be wrong object = session.query(model).filter(**kwargs).first() return object except DoesNotExistException: # or whatever error/exception it is on SQLA object = model() # do it here if you want to save the obj to the db return object 

而已。 使用它:

 obj = get_or_create(SomeObject, filters) 

如果你愿意的话,把**kwargs改成一个简单的参数(比如some_filters)

尝试包装你经常使用的东西(把它们包装到函数或类中)

那只是伪代码,可能是语法错误。

编辑:强调

我知道这不是一步,但这是可以接受的吗?

 my_object = session.query(SomeObject).filter(some_filter).first() if my_object is None: my_object = SomeObject() #process 
 from sqlalchemy.orm.util import has_identity my_object = session.query(SomeObject).get(id) or SomeObject() # Processing... # Check if the object exists in the database if not has_identity(my_object): session.add(my_object) session.commit() 

如果需要,.get()可以用filter()+ first()replace

 if DBSession.query(ObjectType).filter(ObjectType.some_parametter == "This").first() is None: 

这是检查logging是否存在的有效的一种方式。 它是有效的,因为它只抓取第一个对象,并且它可以在一行上,因为first()在没有匹配的logging时返回None。 希望有所帮助!

这里有一些好的build议。 如何使用NoResultFoundexception?

 try: existing = dbsession.query(SomeObject).filter_by(value=value).one() return existing except sqlalchemy.orm.exc.NoResultFound: obj = SomeObject() 

你可以使用这个:

 sth = session.query.filter_by().first() if sth is None: .... else: .... 

我testing过了,效果很好。