我有一个URL https://example.com?p1=nai&p2=tex&p3=mak
我正在使用小马ORM +水瓶,在MYSQL上。我希望得到与URL参数匹配的所有行。p1、p2和p3是表中的字段,可以根据用户输入而变化。
在MySQL中,我将有类似于done、SELECT * FROM表名的内容,其中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)上面的查询只返回第一个参数的匹配。也就是说,如果p1= nai,那么它将返回p1= nai的所有位置,而忽略其余的。我遗漏了什么?注意:不要担心SQL注入
发布于 2018-04-19 18:03:04
如果要通过完全匹配的方式筛选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。
发布于 2018-04-19 17:33:07
您可以使用请求参数以及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) )时,它会给您带来错误,因此您必须考虑到这一点。
编辑:我完全错过了小马ORM的一点,抱歉。我对此一无所知,但如果您可以以与SQL相同的方式进行查询(column1=value1,column2=value2,.)它也应该适用于这个例子。无论如何,我都会把它留在这里,因为它对于那些使用的人仍然很有用。
发布于 2018-04-20 02:33:47
领导
kwargs = {'name': 'John', 'age': 20})
query = Register.select().where(**kwargs)
resp= []
for r in query:
resp.append({"id":r.id,.,...............)
return jsonify(resp)亚历山大的上述答案是正确的,但只会返回一个答复。您可能必须创建python数组并在查询结果中追加多个值。
https://stackoverflow.com/questions/49924356
复制相似问题