我有一个网址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注入
答案 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)
)时,它会给你错误,所以你必须考虑到这一点。
答案 1 :(得分:0)
如果要通过完全匹配过滤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)
我上面的查询只返回第一个参数的匹配项。
我怀疑这是由您的代码中的某些错误引起的,也许您将新查询分配给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数组并在查询结果中附加多个值。