首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/ PonyORM /MySQL -使用多个URL进行查询

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

Stack Overflow用户
提问于 2018-04-19 15:04:16
回答 3查看 246关注 0票数 1

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

我正在使用小马ORM +水瓶,在MYSQL上。我希望得到与URL参数匹配的所有行。p1、p2和p3是表中的字段,可以根据用户输入而变化。

在MySQL中,我将有类似于done、SELECT * FROM表名的内容,其中p1=nai&p2=tex

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

代码语言:javascript
复制
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注入

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-19 18:03:04

如果要通过完全匹配的方式筛选PonyORM参数,可以为filterwhere方法指定关键字参数:

代码语言:javascript
复制
kwargs = {'name': 'John', 'age': 20}
query = Route.select().where(**kwargs)

对于更复杂的查询,可以使用getattr

代码语言:javascript
复制
for name, value in kwargs.items():
    query = query.where(lambda r: getattr(r, name) == value)

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

我怀疑这是由代码中的一些错误引起的,也许您为query2分配了新的查询,然后使用了以前的query而不是query2

票数 1
EN

Stack Overflow用户

发布于 2018-04-19 17:33:07

您可以使用请求参数以及python所具有的**kwargs功能。让我们假设我们想在我们的用户数据库中寻找一个名为bob的人,这个数据库已经22岁了:

代码语言:javascript
复制
http://127.0.0.1:5000/?name=bob&age=22

可以将请求参数转换为如下所示的字典:

代码语言:javascript
复制
argumentdict = request.args.to_dict()

然后,可以使用kwargs查询我们的用户。

代码语言:javascript
复制
users = User.query.filter_by(**argumentdict).all()

这与以下几点相同:

代码语言:javascript
复制
users = User.query.filter_by(name='bob', age='22').all()

然后将所有名为bob和22岁的用户都列在一个列表中。

完全工作的片段:

代码语言:javascript
复制
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,将打印:

代码语言:javascript
复制
[<User 3>]

但是,在使用无效的请求参数(name=bob&age=22&country=russia) )时,它会给您带来错误,因此您必须考虑到这一点。

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

票数 0
EN

Stack Overflow用户

发布于 2018-04-20 02:33:47

领导

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49924356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档