基于传递的参数

时间:2018-04-20 10:11:39

标签: mysql sql pymysql

我有一个表用户:

FirstName, LastName, Status, City

还有更多领域。我在前端显示这个表,我需要根据每列进行过滤, 在服务器端。 目前,SQL查询提取所有数据:

SELECT * FROM Users

但我使用graphql,我希望能够只将选定的过滤器传递给查询, 例如:

WHERE Status = 'single'

我在后端上使用python ( pymysql)。 我如何做到这一点,以便当他开始按名称查询时,单独选择状态后的示例 它查询状态为单身的那些,等等。

2 个答案:

答案 0 :(得分:0)

不确定我到底想要什么,但听起来你需要在过滤器上应用过滤器。也就是说,使用第一个过滤器减少行数,然后您想应用第二个过滤器以进一步减少行数,依此类推。

如果是这种情况,您需要在用户会话中保留过滤条件(可能使用列表,数组或集合),以便全部累积它们。

第一次,列表没有任何元素,因此您的表将显示所有行,您的SQL将如下所示:

select * from users

当用户添加选择过滤器(状态'单个')时,界面会将其添加到列表中。使用列表,您的后端将生成新的SQL:

select * from users
  where status = 'single'

接下来,当用户添加新的选择过滤器(城市'罗马')时,您将其添加到列表中。使用列表后端将生成新的SQL:

select * from users
  where status = 'single'
    and city = 'Rome'

等等。所以你需要处理两件事:

  • 维护"过滤列表":当用户点击界面上的不同位置/按钮时,添加/删除/清除过滤条件。
  • 使用列表中的元素动态构建SQL。

那就是它!

答案 1 :(得分:0)

您可以通过在查询中使用参数来解决此问题。无论如何,您应该这样做以防止SQL注入攻击。您的查询将如下所示:

Select * from users
where 
 (@Firstname is null or FirstName = @FirstName) and 
 (@LastName is null or LastName = @LastName) and 
 (@Status is null or Status = @Status) and
 (@City is null or City = @City)

为了使您的查询字符串始终保持不变,您只需更改参数。检查驱动程序的文档如何添加参数和值。大多数语言驱动程序都支持命名参数,但我不知道pymysql驱动程序是如何做到的。