【问题标题】:Querying DB for users when not all given parameters are filled未填写所有给定参数时为用户查询数据库
【发布时间】:2017-07-29 16:00:36
【问题描述】:

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

目前我有一个 sqllite 数据库,其中有一些用户,他们有名字、姓氏、出生日期、高中和高中班级。 db 使用 sqlalchemy 连接到烧瓶。我想知道的是对于我的搜索功能,我有 4 个输入,我想拥有它,所以如果不使用输入,那么它就不会在搜索查询中使用。假设该人搜索姓氏和高中,我希望它仅使用这些参数进行搜索。我试过用一堆 if 语句来做这件事,但看起来很乱,必须有更好的方法。下面是我使用的查询,但只有在全部 4 个都填满时才有效。有没有比一堆带有不同查询的 if 语句更好的方法?我环顾四周,没有发现任何东西。

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

【问题讨论】:

  • 在调用filter_by时,省略你不想搜索的元素对应的kwargs
  • 有没有让它不使用设置为 none 或 '' 的 kwargs?
  • 不要传递 kwargs 并将不需要的参数设置为 ''None - 改为删除空值。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案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 是一个赋值。

【讨论】:

  • 我这样做了,它似乎没有在名字之后过滤,就像如果我有 2 个名字相同但年份不同的人,它不会在他们之间过滤。
  • 您需要通过在过滤器中添加年份来进一步优化搜索。我假设您的模型中有一个年份列。
  • 年份是 hs_class_strip,即使他们有不同的姓氏,我尝试过滤它仍然会返回多个条目
  • 我根据这个链接更新了答案:stackoverflow.com/questions/12517414/…filter() 返回一个新的查询对象,但你不存储它。每次将 p 替换为结果:
【解决方案2】:

好吧,我所做的就是像你说的那样做一个 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)

【讨论】:

  • 很高兴为您服务!
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多