我尝试使用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
的情况下获得一些数据,而其他一切似乎都很好。
我做错了什么?
答案 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
的任何行都将匹配并返回。