Python MySQL返回列的名称而不是值

Python MySQL返回列的名称而不是值,python,mysql,Python,Mysql,我从MySQL数据库中读取数据,使用以下命令查找数据库中特定列的值: select = ["c9", "TEMP"] c.execute("SELECT Client, %s, Date_Time FROM data WHERE Client = %s and Date_Time > '2016-04-26 18:17:15'", (select[1],select[0])) 但是,我得到的是下面的值,这些值对于第一列和第三列都是正确的,但是,我得到的是第二列的名称,而不是值: ('c9

我从MySQL数据库中读取数据,使用以下命令查找数据库中特定列的值:

select = ["c9", "TEMP"]
c.execute("SELECT Client, %s, Date_Time FROM data WHERE Client = %s and Date_Time > '2016-04-26 18:17:15'", (select[1],select[0]))
但是,我得到的是下面的值,这些值对于第一列和第三列都是正确的,但是,我得到的是第二列的名称,而不是值:

('c9', 'TEMP', datetime.datetime(2016, 4, 26, 20, 6, 53))
('c9', 'TEMP', datetime.datetime(2016, 4, 26, 20, 7, 53))
('c9', 'TEMP', datetime.datetime(2016, 4, 26, 20, 8, 53))
而不是这个例子

('c9', '2700', datetime.datetime(2016, 4, 26, 20, 6, 53))
('c9', '2720', datetime.datetime(2016, 4, 26, 20, 7, 53))
('c9', '2700', datetime.datetime(2016, 4, 26, 20, 8, 53))

那么,如何检索值而不是列名?

列名不能在查询中参数化。您必须以其他方式插入列名:

select = ["c9", "TEMP"]
query = "SELECT Client, {}, Date_Time FROM data WHERE Client = %s and Date_Time > '2016-04-26 18:17:15'".format(select[1])
cursor.execute(query, (select[0],))
请注意,在插入列名时,这会使您容易受到SQL注入的影响。你应该检查一下以确保安全。我会在谨慎方面犯错误,并采取如下措施:

assert select[1].isalnum()

AssertionError在这里可能不是正确的错误,因为它应该用于检查内部不变量。引发ValueError或自定义异常可能更合适。

列名不能在查询中参数化。您必须以其他方式插入列名:

select = ["c9", "TEMP"]
query = "SELECT Client, {}, Date_Time FROM data WHERE Client = %s and Date_Time > '2016-04-26 18:17:15'".format(select[1])
cursor.execute(query, (select[0],))
请注意,在插入列名时,这会使您容易受到SQL注入的影响。你应该检查一下以确保安全。我会在谨慎方面犯错误,并采取如下措施:

assert select[1].isalnum()

AssertionError在这里可能不是正确的错误,因为它应该用于检查内部不变量。提出ValueError或自定义异常可能更合适。

谢谢老板。这对我很有效,但我想问一下安全问题,为什么不使用这个命令c.executeSELECT Client,{},date\u Time FROM data WHERE Client=%s and date\u Time>'2016-04-26 18:17:15'。formatselect[1],select[0]?我本来会使用它,但它确实会给我这个错误,不是所有的参数在字符串格式化过程中都会被转换,我想这是因为参数需要作为一个参数提供。您正在传递select[0],它是一个字符串和一系列字符。如果您这样做,它是否工作:c.executeSELECT Client,{},date\u Time FROM data WHERE Client=%s and date\u Time>'2016-04-26 18:17:15'。formatselect[1],[select[0]]?这很好,老板。我应该坚持这个吗?如果更好的话,如果你能在答案中包含它,那就太好了。@AhmedAl haddad-我更喜欢它出现的版本,我认为它更容易阅读,也更容易编写验证表名的代码,但是如果你喜欢1-liner,请随意使用它。谢谢老板。这对我很有效,但我想问一下安全问题,为什么不使用这个命令c.executeSELECT Client,{},date\u Time FROM data WHERE Client=%s and date\u Time>'2016-04-26 18:17:15'。formatselect[1],select[0]?我本来会使用它,但它确实会给我这个错误,不是所有的参数在字符串格式化过程中都会被转换,我想这是因为参数需要作为一个参数提供。您正在传递select[0],它是一个字符串和一系列字符。如果您这样做,它是否工作:c.executeSELECT Client,{},date\u Time FROM data WHERE Client=%s and date\u Time>'2016-04-26 18:17:15'。formatselect[1],[select[0]]?这很好,老板。我应该坚持这个吗?如果更好的话,如果你能在答案中包含它,那就太好了。@AhmedAl haddad-我更喜欢它被分解的版本,我认为它更容易阅读,也更容易编写代码来验证表名,但是如果你喜欢1-liner,请随意使用它。