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)
elb*_*ear 24
这是很久以前的问题,但对于未来的访客来说,更简洁的检查方法是
if session.query(model).filter(some_filter).count():
# do stuff
Run Code Online (Sandbox Code Playgroud)
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)
尝试包装你经常使用的东西(将它们包装到函数或类中)
那只是伪代码,可能有语法错误.
编辑:强调
我知道这不是一步到位,但这是否可以接受?
my_object = session.query(SomeObject).filter(some_filter).first()
if my_object is None:
my_object = SomeObject()
#process
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57133 次 |
| 最近记录: |