如何优雅地检查对象/实例/变量的存在,并同时将其分配给变量(如果它存在于python中)?

Auf*_*ind 66 python sqlalchemy

我正在使用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
Run Code Online (Sandbox Code Playgroud)

梦想的是:

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...
Run Code Online (Sandbox Code Playgroud)

我知道,这种语法是错误的,但我想解释一下,我的意思是这个例子.任何等效的方式都会让我开心.

这种模式有一种优雅的python方法吗?这个问题不仅针对SQLAlchemy,而且针对每个等效场景.

闭上眼睛打"发布你的问题"并等待聪明的人和蟒蛇人用心去追捕我,因为他们可能会说些不合适的东西 ;-)

Rac*_*ach 97

您希望执行Exist查询以提高效率

(ret, ), = Session.query(exists().where(SomeObject.field==value))
Run Code Online (Sandbox Code Playgroud)

Mike Bayer在他的博客文章中解释了这一点:http:
//techspot.zzzeek.org/2008/09/09/selecting-booleans/

如果您不希望结果为元组,则可以使用标量:

ret = Session.query(exists().where(SomeObject.field==value)).scalar()
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记导入exists():`来自sqlalchemy import exists` (17认同)
  • 我找到了.`ret = Session.query(exists().where(and_(Someobject.field1 == value1,Someobject.field2 == value2))) (4认同)
  • 如何检查多个字段?即在'where'调用类似'Someobject.field1==value1 and Someobject.field2==value2' (2认同)

elb*_*ear 24

这是很久以前的问题,但对于未来的访客来说,更简洁的检查方法是

 if session.query(model).filter(some_filter).count():
     # do stuff
Run Code Online (Sandbox Code Playgroud)

  • `count()`可能很简洁,但也效率低 - 检查*与过滤器X匹配的事物数量多于查看*任何*事物是否与过滤器X匹配; 对于"存在"检查,可以在找到第一个匹配时声明成功,而不是继续寻找更多. (22认同)
  • 这看起来就像他要求的那样. (2认同)
  • 什么是模型,什么是some_filter? (2认同)

kus*_*sut 14

将它包装在一个函数上(从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
Run Code Online (Sandbox Code Playgroud)

而已.使用它:

obj = get_or_create(SomeObject, filters)
Run Code Online (Sandbox Code Playgroud)

**kwargs如果你愿意,可以将其更改为一个简单的参数(如some_filters)

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

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

编辑:强调

  • 奖励点:尝试让你的函数告诉你,它给你的对象是来自db还是新创建的(提示已经存在:请参阅django的get_or_create) (2认同)

mul*_*ces 5

我知道这不是一步到位,但这是否可以接受?

my_object = session.query(SomeObject).filter(some_filter).first()
if my_object is None:
    my_object = SomeObject()
#process
Run Code Online (Sandbox Code Playgroud)