Flask中使用psycopg2向Postgres LIKE查询传字符串变量失败排查
问题原因与解决方法
你的LIKE查询语法不正确,问题出在变量传递时没有包含模糊匹配所需的通配符%。
为什么原来的代码返回空?
你直接执行的LIKE '%Abcd%'是查询包含"Abcd"的记录,但用参数传递时,你传入的tag = "Abcd"只会让SQL等价于:
SELECT * FROM database WHERE message LIKE 'Abcd' ESCAPE ''
这是精确匹配,只有当message字段完全等于"Abcd"时才会返回结果,而你的数据库里是包含该字符串的记录,所以返回空。
正确的写法有两种:
写法1:在变量中拼接通配符
直接给tag加上前后%,保持SQL语句不变:
tag = "%Abcd%" conn = get_db_connection() cur = conn.cursor() cur.execute("SELECT * FROM database WHERE message LIKE %s ESCAPE ''", (tag,)) data = cur.fetchall() cur.close() conn.close()
写法2:在SQL语句中拼接通配符
如果不想修改tag变量,可以用Postgres的字符串拼接操作符||在SQL里组合通配符和变量:
tag = "Abcd" conn = get_db_connection() cur = conn.cursor() cur.execute("SELECT * FROM database WHERE message LIKE '%' || %s || '%' ESCAPE ''", (tag,)) data = cur.fetchall() cur.close() conn.close()
注意事项
如果tag是用户输入的内容,要注意处理通配符转义(比如用户输入的字符串里包含%或_),不过你当前设置了ESCAPE '',意味着这些字符会被当作普通字符处理,如果你需要保留它们的通配符功能,可以去掉ESCAPE '',或者手动转义后再传入。
内容的提问来源于stack exchange,提问作者variable32
相关产品推荐
相关产品推荐

