使用多个url参数进行查询

z31licg0  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(384)

我有一个网址https://example.com?p1=nai&p2=tex&p3=mak
我在mysql上使用了pony orm+flask。我想获取所有与url参数匹配的行。p1、p2和p3是表中的字段,可以根据用户输入而变化
在mysql中,我会做一些类似于done的事情[select*from table name where p1=nai&p2=tex]
在我的小马/ flask 代码下面

query = select(r for r in Route)
for key,value in args.items():
    query = query.where("lambda r: r.%s == '%s'" %(key, value))
    print(r.id)

我上面的查询只返回第一个参数的匹配。i、 如果p1=nai,那么它将返回p1=nai处的所有值,并忽略其余值。我错过了什么?注意:不要担心sql注入

6yoyoihd

6yoyoihd1#

抬头

kwargs = {'name': 'John', 'age': 20})
    query = Register.select().where(**kwargs)
    resp= []
    for r in query:
        resp.append({"id":r.id,.,...............)
    return jsonify(resp)

alexander的上述答案是正确的,但只会返回1个响应。您可能需要创建一个python数组并在查询结果中附加多个值。

hc8w905p

hc8w905p2#

如果要按完全匹配筛选具有ponyorm的参数,可以将关键字参数指定为 filter 或者 where 方法:

kwargs = {'name': 'John', 'age': 20}
query = Route.select().where(**kwargs)

对于更复杂的查询,可以使用 getattr :

for name, value in kwargs.items():
    query = query.where(lambda r: getattr(r, name) == value)

我上面的查询只返回第一个参数的匹配。
我怀疑这是由代码中的某个bug引起的,也许您将新的查询分配给 query2 然后使用上一个 query 而不是 query2 .

5vf7fwbs

5vf7fwbs3#

您可以将请求参数与python的**kwargs功能一起使用。假设我们想在我们的用户数据库中寻找一个叫bob的人,他今年22岁:

http://127.0.0.1:5000/?name=bob&age=22

您可以将请求参数转换为如下所示的字典:

argumentdict = request.args.to_dict()

然后可以使用kwargs查询我们的用户

users = User.query.filter_by(**argumentdict).all()

这和:

users = User.query.filter_by(name='bob', age='22').all()

它将把所有名为bob,年龄为22岁的用户放在一个列表中。
完全工作的代码段:

from flask import Flask, render_template, request, render_template_string
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    age = db.Column(db.Integer)

db.create_all()

for name, age in [['Bob', 45], ['John', 55], ['Bob', 22]]:
    user = User()
    user.name = name
    user.age = age
    db.session.add(user)

db.session.commit()

@app.route("/")
def index():
    argumentdict = request.args.to_dict()
    users = User.query.filter_by(**argumentdict).all()
    print(users)

app.run()

使用此查询: http://127.0.0.1:5000/?name=bob&age=22 ,将打印:

[<User 3>]

但是,当它与无效的请求参数一起使用时,它会给您带来错误( name=bob&age=22&country=russia) 所以你必须考虑到这一点。
编辑:我完全错过了小马奥姆位,抱歉。我对此一无所知,但是如果您可以使用与sql alchemy中相同的方式进行查询(column1=value1,column2=value2,…),那么它也应该适用于这个示例。不管怎样,我还是把它留在这里,因为它对那些使用sql炼金术的人仍然有用。

相关问题