如何优雅地检查一个对象/实例/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过了,效果很好。