当未填写所有给定参数时,查询用户的DB

时间:2017-07-29 16:00:36

标签: python flask sqlalchemy flask-sqlalchemy

很抱歉标题令人困惑,很难弄清楚如何说出这个问题。

目前我有一个sqllite数据库,其中有一些用户,他们有名字,姓氏,dob,高中和高中课程。使用sqlalchemy将db连接到烧瓶。我想知道的是我的搜索功能我有4个输入,我想拥有它,所以如果没有使用输入,那么它将不会在搜索查询中使用。假设此人搜索姓氏和高中,我希望它只使用这些参数进行搜索。我已经尝试使用一堆if语句来做这个但是看起来很混乱必须有更好的方法。下面是我使用的查询,但只有在所有4个填充时才有效。有一种比一堆具有不同查询的if语句更好的方法吗?我环顾四周,没找到任何东西。

userq=User.query.filter_by(first_name=fname_strip,last_name=lname_strip,hs_class=hs_class_strip).all()

3 个答案:

答案 0 :(得分:1)

您可以尝试if / else语句,如下所示:

q = User.query.filter_by(first_name=first_name)
if lname_strip:
    q = q.filter_by(last_name=lname_strip)
if hs_class_strip:
    q= q.filter_by(hs_class=hs_class_strip)

# Execute the query
q.all()
  • 更新需要q作为作业。

答案 1 :(得分:1)

好的,所以我所做的就是通过像你说的那样制作一个if语句但是把它们变成了不同的变种。然后检查它们是否在哪里或不正确,如果它们是好的,那么如果没有那么它们会正确查询,然后查询所有不为空的。然后将它们更改为一个集合然后设置交集以查看所有这些相同的内容。感谢ionheart帮助我完成这项工作并提供信息,这是他使用部分解决方案的完整答案。

            userf=set()
            userl=set()
            userc=set()
            userh=set()
            if fname_strip!='':
                userf = User.query.filter_by(first_name=fname_strip).all()
                print(userf)
            else:
                userf = User.query.filter(User.first_name.isnot(None))
            if lname_strip!='':
                userl = User.query.filter_by(last_name=lname_strip).all()
                print(userl)
            else:
                userl = User.query.filter(User.last_name.isnot(None))
            try:
                int(hs_class_strip)
                userc = User.query.filter_by(hs_class=hs_class_strip).all()
                print(userc)
            except:
                userc = User.query.filter(User.hs_class.isnot(None))
            if hs_strip!='':
                userh = User.query.filter_by(hs=hs_strip).all()
                print(userh)
            else:
                userh = User.query.filter(User.hs.isnot(None))

            userq=[]
            common=set(userf) & set(userl) & set(userc) & set(userh)
            print(common)

答案 2 :(得分:0)

如果将参数作为关键字参数传递给搜索函数,则可以更改签名以接受kwargs并将其传递给过滤器查询

def search(**kwargs):
    userq = User.query.filter_by(**kwargs).all()   

这样,您在调用search时未指定的任何参数都不会传递给查询,例如调用search(first_name='bob', last_name='fossil')只会在查询中添加名字和姓氏参数