1

我有一个网址https://example.com?p1=nai&p2=tex&p3=mak

我在 MYSQL 上使用 PONY ORM + Flask。我想获取与 URL 参数匹配的所有行。p1、p2 和 p3 是表上的字段,可以根据用户输入而变化

在 MySQL 中,我会做类似的事情 [SELECT * FROM Table Name WHERE p1=nai&p2=tex]

在我的 PONY/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)

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

4

3 回答 3

1

如果你想用 PonyORM 通过完全匹配过滤参数,你可以为filterorwhere方法指定关键字参数:

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)

我上面的查询只返回第一个参数的匹配项。

我怀疑这是由您的代码中的某些错误引起的,也许您将新查询分配给query2然后使用 previousquery而不是query2.

于 2018-04-19T18:03:04.953 回答
0

您可以将请求参数与 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),因此您必须考虑到这一点。

编辑:我完全错过了 PONY ORM 位,对此感到抱歉。我对此一无所知,但如果您可以使用与 SQL-Alchemy 中相同的方式进行查询 (column1=value1, column2=value2, ...),那么它也应该适用于这个示例。无论如何我都会把它留在这里,因为它对那些使用 SQL-Alchemy 的人仍然有用。

于 2018-04-19T17:33:07.223 回答
0

小心

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

于 2018-04-20T02:33:47.160 回答