【问题标题】:Multiple field filtering using pyDAL使用 pyDAL 进行多字段过滤
【发布时间】:2016-12-14 15:40:17
【问题描述】:

编辑:我想我解决了,我添加了答案。

我正在使用 python 编写一个 REST API, Falcon 作为 Web 框架,pyDAL 作为 MySQL 的 DAL。

我想使用获取请求的查询字符串中获得的字段进行过滤(where 语句)。

例如我收到以下获取请求:

http://127.0.0.1:5000/users?firstName=FirstN&id=1

我希望 pyDAL 将查询生成以下 SQL:

SELECT * FROM users WHERE firstName = 'FirstN' AND id = '1'

我找不到可以做到这一点的东西,因为 pyDAL 想收到类似的东西:

self.db((self.db.users.id == 1) & (self.db.users.firstName == 'FirstN')).select()

但我无法指定字段,因为我不知道要过滤哪个字段,这就是我写这个的原因:

def on_get(self, req, resp):
    if req.query_string is not '':
        input = req.query_string
        sql = 'SELECT * FROM users WHERE '
        sql += ' AND '.join(['{col} = \'{value}\''.format(col=item.split('=')[0], value=item.split('=')[1]) for item in input.split('&')])
        resp.body = json.dumps(self.db.executesql(sql, as_dict=True))
    else:
        resp.body = json.dumps(self.db(self.db.users).select().as_dict())

但我认为这很糟糕,应该是一个更好的原因。

【问题讨论】:

    标签: python pydal


    【解决方案1】:

    我创建了一个接收 Table 对象和查询字符串的函数:

    def generate_filter(table, query_string):
        statement = True
        for field in query_string.split('&'):
            field = field.split('=')
            statement &= getattr(table, field[0]) == field[1]
        return statement
    

    比我执行:

    self.db(generate_filter(self.db.users, req.query_string)).select().as_dict()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多