Python,sql炼金术。如何进行更有效的搜索?

2024-10-05 10:09:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,更有效的搜索,我已经做了不同的代码,并没有说服我。我想找一个有三个过滤器的雇员,名字,姓和他工作的部门。在

视图中的代码如下:

if form.nombre.data == u'' and form.apellido.data == u'' and form.departamento.data != u'':
    empleados = db.session.query(Empleado).filter_by(departamento_id=form.departamento.data).all()

elif form.nombre.data == u'' and form.apellido.data != u'' and form.departamento.data == u'':
    empleados = db.session.query(Empleado).filter_by(apellido=form.apellido.data.lower()).all()

elif form.nombre.data == u'' and form.apellido.data != u'' and form.departamento.data != u'':
    empleados = db.session.query(Empleado).filter_by(apellido=form.apellido.data.lower(),
                                                         departamento_id=form.departamento.data).all()

elif form.nombre.data != u'' and form.apellido.data == u'' and form.departamento.data == u'':
    empleados = db.session.query(Empleado).filter_by(nombre=form.nombre.data.lower()).all()

elif form.nombre.data != u'' and form.apellido.data == u'' and form.departamento.data != u'':
    empleados = db.session.query(Empleado).filter_by(nombre=form.nombre.data.lower(),
                                                         departamento_id=form.departamento.data).all()

elif form.nombre.data != u'' and form.apellido.data != u'' and form.departamento.data == u'':
    empleados = db.session.query(Empleado).filter_by(nombre=form.nombre.data.lower(), apellido=form.apellido.data.lower()).all()

elif form.nombre.data != u'' and form.apellido.data != u'' and form.departamento.data != u'':
    empleados = db.session.query(Empleado).filter_by(nombre= form.nombre.data.lower(), apellido=form.apellido.data.lower(), departamento_id=form.departamento.data).all()

else:
    empleados = db.session.query(Empleado).all()

正如你所看到的,这是一个可怕的代码。如果你要添加一个过滤器,更多的将是16个语句的组合,更不用说两个了。在

任何类型的回应都是受欢迎的。谢谢你


Tags: andformdbdatabysessionallfilter
2条回答

只需在运行时构建查询,类似于:

query = db.session.query(Empleado)

if form.nombre.data != '':
    query = query.filter_by(nombre=form.nombre.data.lower())
if form.apellido.data != '':
    query = query.filter_by(apellido=form.apellido.data.lower())
if form.departamento.data != '':
    query = query.filter_by(departamento_id=form.departamento.data)

print query.all()

您可能需要使用或或或和过滤器。比如:

from sqlalchemy import or_
filter(or_(User.name == 'ed', User.name == 'wendy'))

另请参见tutorial和这个post。在

相关问题 更多 >

    热门问题