在python中的select语句的like子句中使用%

时间:2018-02-13 22:59:17

标签: python pypyodbc

import pypyodbc as pyodbc
model_name = 'test'
model_name1 = Master_Cursor.execute("select col1,col2,col3 from tablename where col3 like '%s' order by col3" %(model_name)).fetchall()

上面的代码返回一条匹配model_name = test的记录。 我如何找回model_name=123test123,abctestabc,ABCtestABC等其他记录?

基本上,寻找

select col1,col2,col3 from tablename where col3 like '%test%'.

3 个答案:

答案 0 :(得分:2)

使用字符串格式将变量插入到查询中,这会让您面临SQL注入的风险(请参阅例如What is SQL injection?)而不是the documentation ,您应该使用?来表示查询中的变量,并让库转义并适当地插入它们。

接下来,如果你想要更宽松的匹配,你需要实际包含通配符和model_name。目前你正在创建:

select col1,col2,col3 from tablename where col3 like 'test' order by col3

在将传递给查询之前,您需要使用通配符围绕model_name,例如使用'%%%s%%' % model_name(请注意,您需要重复每个%以在printf-style formatting中)或其中一个更现代的字符串格式选项。

在这种情况下,例如(使用str.format):

model_name1 = Master_Cursor.execute(
    "select col1, col2, col3 from tablename where col3 like ? order by col3",
    ("%{}%".format(model_name),)
).fetchall()

答案 1 :(得分:0)

以下应该起作用:

pattern = "%"+model_name+"%"
db.execute("select col1,col2,col3 from tablename where col3 like :s order by col3" ,{"s":pattern}).fetchall()

答案 2 :(得分:-3)

model_name1 = Master_Cursor.execute("select col1,col2,col3 from tablename where col3 like '%%%s%%' order by col3" %(model_name)).fetchall()

使用2%来表示真实的百分比字符