Python3:使用变量处理sqlite3 SELECT

时间:2016-05-18 11:51:09

标签: python python-3.x sqlite

我尝试使用LIKE参数获取SQL选择,但它只给出了我的唯一:

false,"error_code":400,"description":"Bad Request: Message text is empty"

这是我的代码:

textvar = message.text 
c.execute("SELECT * FROM run WHERE act LIKE '+textvar+'")
res = c.fetchone() 
bot.send_message(message.chat.id, res)

print textvar为我提供了sting,取自message.text。我试图在没有LIKE的情况下获得一些数据,而其他一切似乎都很好。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您正在测试'+textvar+'列中是否存在字符串textvar变量act中的值!)。没有这样的专栏。

不要使用字符串插值将变量插入到SQL查询中,因为这会让您更容易接受SQL注入攻击。使用查询参数:

textvar = '%{}%'.format(message.text)
c.execute("SELECT * FROM run WHERE act LIKE ?", (textvar,))

请注意,我确实使用字符串插值将% 通配符添加到字符串中,以确保LIKE在列中的任何位置搜索文本 。没有通配符LIKE只不过是一个平等测试。 %匹配0个或更多个任意字符,_恰好匹配1个任意字符。请参阅LIKE operator documentation

因此,对于示例文本'sting',上面的代码生成字符串'%sting%',然后数据库适配器负责正确引用并对数据库执行SELECT * FROM run WHERE act LIKE '%sting%' SQL查询。 act包含子字符串sting的任何行都将匹配并返回。