Pregunta

Estoy intentando montar el siguiente declaración SQL mediante DB-API de Python:

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

donde BEGINNING_OF_STRING debe ser una var pitón para ser llenado de manera segura a través de la DB-API. Probé

beginningOfString = 'abc'

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

Estoy fuera de las ideas; ¿cuál es la forma correcta de hacer esto?

¿Fue útil?

Solución

Lo mejor es separar los parámetros de la sql si es posible. A continuación, puede dejar que el PP módulo de cuidar de citar adecuada de los parámetros.

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)

Otros consejos

EDIT:

Como Brian y Thomas señalaron, la ahora una mejor manera de hacer esto sería utilizar:

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

ya que las primeras hojas de método se abre a ataques de inyección SQL.


izquierda en la historia:

Trate:

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

Sqlite3 documentación:

  

Por lo general, sus operaciones SQL necesitará   utilizar valores de variables de Python.   No se debe montar su consulta   mediante operaciones de cadenas de Python   porque hacerlo es inseguro; hace   su programa vulnerable a un SQL   ataque de inyección.

     

En su lugar, utilice el parámetro de DB-API   sustitución. Poner ? como un marcador de posición   donde quiera que desee utilizar un valor, y   a continuación, proporcionar una tupla de valores como la   segundo argumento de la década de cursor   ejecutar método (). (Otras bases de datos   módulos pueden usar una diferente   marcador de posición, tales como% s o:. 1) Para   ejemplo:

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

Creo que quieres esto:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top