【问题标题】:Using % in like clause of select statement in python在python中select语句的like子句中使用%
【发布时间】:2018-02-13 22:59:16
【问题描述】:
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%'.

【问题讨论】:

  • 第一件事是使用字符串格式来创建查询,因为这会使您容易受到 SQL 注入的影响。
  • 此外,如果您必须进行字符串格式化,还有比printf 样式更多的最新选项!你的问题的简单答案是stackoverflow.com/q/10678229/3001761,但你真的应该使用适当的变量处理,as documented
  • 猜测:model_name1 = Master_Cursor.execute("SELECT col1,col2,col3 FROM tablename WHERE col3 LIKE ? ORDER BY col3",(model_name,)).fetchall()
  • @roganjosh 是的,我希望看到... LIKE ?,那么变量中的通配符也将包含%。例如:stackoverflow.com/a/24377191/3001761.
  • @roganjosh Python DB API 允许各种参数样式:python.org/dev/peps/pep-0249/#paramstyle。我不知道它是否会因底层数据库而异。

标签: python pypyodbc


【解决方案1】:

不要使用字符串格式将变量插入到查询中,这会使您面临 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()

【讨论】:

  • 我认为你需要...., ("%{}%".format(model_name),)) 来创建元组,这样它就不会尝试解包字符串的字符。
  • @roganjosh 我希望处理得当,但是会出现一条相当迅速的错误消息,提示将六个参数传递给一个占位符!
  • 只是抢占了同一主题的另一个问题:P 无论如何,+1,很遗憾接受的答案使用字符串插值。
【解决方案2】:

以下应该有效:

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

【讨论】:

    【解决方案3】:
    model_name1 = Master_Cursor.execute("select col1,col2,col3 from tablename where col3 like '%%%s%%' order by col3" %(model_name)).fetchall()
    

    使用 2% 来表示一个真正的百分比字符

    【讨论】:

    • 这会起作用,但仍有问题已被评论不要使用字符串插值来构建查询。
    • 2 否决了已接受的答案...并且唯一一个正确回答了 OP 提出的问题。另外...没有其他答案提到使用 2% 作为转义百分比的技术,这确实具有合法用途
    • “唯一正确回答问题的人” - 实际问题是“我如何取回其他记录”,而不是“我如何在 Python 强格式中转义百分比”,我希望您代表中的某个人能够发现 XY 问题,即使它确实提出了这个问题。 “没有其他答案提到” - 我的确实提到它。在发表评论之前,您是否真的阅读了问题或其他人的答案? “确实有合法用途” - 但你甚至没有暗示这可能不是其中之一。
    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 2011-09-19
    • 2019-06-02
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多