how to safely generate a SQL LIKE statement using python db-api

后端 未结 3 623
悲哀的现实
悲哀的现实 2020-12-06 05:08

I am trying to assemble the following SQL statement using python\'s db-api:

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

wh

相关标签:
3条回答
  • 2020-12-06 05:34

    It's best to separate the parameters from the sql if you can. Then you can let the db module take care of proper quoting of the parameters.

    sql='SELECT x FROM myTable WHERE x LIKE %s'
    args=[beginningOfString+'%']
    cursor.execute(sql,args)
    
    0 讨论(0)
  • 2020-12-06 05:52

    Take note of Sqlite3 documentation:

    Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack.

    Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.) For example:

    # 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)
    

    I think you want this:

    cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
    
    0 讨论(0)
  • 2020-12-06 05:59

    EDIT:

    As Brian and Thomas noted, the far better way to do this would be to use:

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

    since the first method leaves you open to SQL injection attacks.


    Left in for history:

    Try:

    cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
    
    0 讨论(0)
提交回复
热议问题