【问题标题】:how do i write multiple conditions in single sql query to get data - Python mysql如何在单个 sql 查询中编写多个条件以获取数据 - Python mysql
【发布时间】:2013-11-13 11:18:40
【问题描述】:

我处于两难境地,我该如何编写这样的 sql 查询来进行搜索。我已经尝试并发布了它,但是当用户在表单的多个字段中输入数据并进行搜索时,它并不像预期的那样。

我为单个表单字段编写表单并进行搜索和显示的查询

#!/usr/bin/python

import cgi
import MySQLdb

class Table():

    def __init__(self, host, user, passwd, name):

        self.db = MySQLdb.connect(host = host, user = user, passwd = passwd, db = name)
        self.cursor = self.db.cursor()

    def getdata(self, fname, lname, age, gender):
        self.fname = fname
        self.lname = lname
        self.age = age
        self.gender = gender

    def mysqlconnect(self):

        sql = "select * from PERSON where F_Name = '%s' or L_Name = '%s' or Age = '%s' or Gender = '%s' " %(self.fname, self.lname, self.age, self.gender)
        self.cursor.execute(sql)
        result = self.cursor.fetchall()

        for row in result:
            print "<br>", row[0], row[1], row[2], row[3]

        self.cursor.close()
        self.db.close()


def main():

    print "Content-type: text/html\n"
    tableobj = Table("localhost", "root", "root", "Info")

    form = cgi.FieldStorage()
    f_name = form.getvalue('firstname', '')
    l_name = form.getvalue('lastname', '')
    age = form.getvalue('age', 0)
    gender = form.getvalue('gender', '')

    tableobj.getdata(f_name, l_name, age, gender)
    tableobj.mysqlconnect()

if __name__ == "__main__":
    main()

如果假设用户在 FirstName 字段和 Gender 字段中输入数据

 Firstname: Jeremy
 Gender: male

那么它应该显示记录。 如果假设用户在年龄字段和性别字段中输入数据

Age : 25
Gender: Female

它应该显示年龄为 25 岁的少数男性的结果。 同样所有可能的条件

【问题讨论】:

  • 哇!我希望你没有把它放在网上,因为你在那里打开了自己的 SQL 注入攻击。 首先了解如何使用 SQL 参数!
  • 使用sql = "select * from PERSON where F_Name = %s or L_Name = %s or Age = %s or Gender = %s",然后使用self.cursor.execute(sql, (self.fname, self.lname, self.age, self.gender))%s 占位符周围没有引号,将参数移动到cursor.execute() 调用的第二个参数。
  • 我只是在本地服务器上练习......代码有什么问题?
  • 除此之外,你没有给我们任何东西。你有什么数据?您使用了哪些搜索条件?你期望得到什么输出,你得到了什么?
  • 所以练习正确,防止你养成非常非常非常坏的习惯。

标签: python mysql cgi mysql-python


【解决方案1】:

杰里米,

为了回答你的问题,Martijn 在这里做了很好的解释:

sql = "select * from PERSON where F_Name = %s or L_Name = %s or Age = %s or Gender = %s", > then self.cursor.execute(sql, (self.fname, self.lname , self.age, self.gender))

但是,就您而言,最好的办法是使用 ORM。从长远来看,这将为您省去很多麻烦!

编写自己的 SQL 查询很好,但是,您会遇到几个问题。基于 SQL 的攻击,以及更难解析数据,是两种。

关于 ORM 的一般信息:http://en.wikipedia.org/wiki/Object-relational_mapping

对于 Python,有一些不错的。 SQLAlchemy 是最知名的,但请环顾四周,看看您需要什么。

【讨论】:

  • 我知道了,但是如果在表单中填写了多个字段,我应该在我的代码中写什么查询??
  • 好吧,你可以做一些事情。您可以根据填写的表单值编写单独的查询,并在提交请求之前使用 Python 对其进行解析。或者,你可以使用 Matijn 在这里给你的查询: > sql = "select * from PERSON where F_Name = %s or L_Name = %s or >Age = %s or Gender = %s", > then self.cursor.execute (sql, (self.fname, self.lname, self.age, self.gender)) 这将允许 fname lname 年龄和性别。或者,你是说你想匹配所有这些值?基本上,您会在查询中使用“and”而不是“or”。
  • 我应该有一个所有条件都应该得到满足的查询。取决于可以在任何表单字段中输入数据并进行搜索的用户。我需要一个查询,但我无法找到我应该写什么
  • 我已经更新了描述。请检查。当某些条件存在时,代码应该是什么?
  • 嗯,这就是为什么 ORM 会很好的原因之一。看这里的例子:peewee.readthedocs.org/en/latest/peewee/… 在这种情况下,您可以只执行多个 .where 查询,每个表单字段一个。如果该字段为空,请不要运行该查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2018-09-06
  • 2015-06-18
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多