Python / PonyORM / MySQL - 使用多个URL Args进行查询

时间:2018-04-19 15:04:17

标签: python mysql flask ponyorm

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

3 个答案:

答案 0 :(得分: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的人来说仍然有用。

答案 1 :(得分:0)

如果要通过完全匹配过滤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)
  

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

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

答案 2 :(得分:0)

抬头

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

亚历山大的上述回答是正确的,但只会返回1回复。您可能必须创建一个python数组并在查询结果中附加多个值。