19

我正在尝试使用 python 的 db-api 组装以下 SQL 语句:

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';

其中 BEGINNING_OF_STRING 应该是一个 python var,可以通过 DB-API 安全地填写。我试过

beginningOfString = 'abc'

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)

我没有想法;这样做的正确方法是什么?

4

3 回答 3

24

如果可以的话,最好将参数与 sql 分开。然后,您可以让 db 模块负责正确引用参数。

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
于 2010-01-19T22:12:17.850 回答
3

编辑:

正如 Brian 和 Thomas 所指出的,更好的方法是使用:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

因为第一种方法使您容易受到 SQL 注入攻击。


留给历史:

尝试:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
于 2010-01-19T22:06:48.770 回答
-1

注意Sqlite3文档:

通常,您的 SQL 操作将需要使用 Python 变量中的值。你不应该使用 Python 的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到 SQL 注入攻击。

相反,使用 DB-API 的参数替换。放 ?作为一个占位符,无论你想在哪里使用一个值,然后提供一个值的元组作为游标的 execute() 方法的第二个参数。(其他数据库模块可能使用不同的占位符,例如 %s 或 :1。)例如:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

我想你想要这个:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
于 2010-01-19T22:18:01.360 回答