使用多个URL参数的Python/PonyORM/MySQL查询

2024-06-26 18:06:19 发布

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

我有一个网址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]

在我的小马/烧瓶代码下面

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注入


Tags: keyinhttpscomfor参数valueexample
3条回答

抬起头来

 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数组并在查询结果中附加多个值。你知道吗

如果要按精确匹配筛选具有PonyORM的参数,可以为filterwhere方法指定关键字参数:

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)

My query above just returns a match for the first parameter.

我怀疑这是由代码中的某个bug引起的,可能您将新查询分配给query2,然后使用前面的query而不是query2。你知道吗

您可以将请求参数与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炼金术的人仍然有用。你知道吗

相关问题 更多 >