mas preguntas :) ahora sacar ' y " :)

Chema Cortés ch3m4 en ch3m4.org
Sab Mayo 29 03:33:31 CEST 2004


Mensaje citado por Ariel Nardelli <pan_python en yahoo.com.ar>:

> >No construyas la sentencia sql con los datos "en línea". Emplea parámetros
> sql
> >tal como se indica en la DB-API. Además de evitar éstos y otros problemas
> >como el sql-injecting, le evitarás mucho trabajo al caché de sentencias del
> >intérprete sql.
> >
> >
> Si yo los armo en linea en una variable..., yo vengo viendo en varios
> ejemplos que me pusiste que usas otro metodo para armar las sentencias
> pero no los entiendo muy bien...
> Por ejemplo en otro mail que mandaste pusiste...
>
>  sql = "insert into destinos values ('%02d','%s','%5d %5d %5d','3560');"
>      db.query(sql%k)
>
> Es as esto lo que te referis? si es asi veo que los % que estan dentro de las
> variables son "mascaras", donde puedo tener informacion de como son esas
> mascaras para poder usarlas? si es posible en español :)

Vayamos por partes:

El operador de formato '%' de python sirve para construir una cadena a partir de
una tupla de elementos, y es similar al que usa el printf de C (busca en
cualquier libro de C). Si quieres información en español:
http://pyspanishdoc.sourceforge.net/lib/typesseq-strings.html
ó en el libro de python de la UJI.

> Si me podes decir donde encuentro info de los parametros sql asi veo el tema.

Luis Miguel te ha puesto una referencia de una conferencia que dio el año
pasado, y que puede serte suficiente para iniciarte en el tema, pero la
documentación de referencia sólo está en inglés.


Segunda Parte

Con la DB-API de python se puede indicar la posición de parámetros sql tanto por
posición como por nombre. Te explicaré los dos casos para MySQLdb, pero antes
déjame explicarte algo más el otro mensajes mío que comentas:

 sql = "insert into destinos values ('%02d','%s','%5d %5d %5d','3560');"
 db.query(sql%k)

La sentencia sql es una cadena con formatos que indica dónde van a ir cada uno
de los elementos con los que se va a combinar. Al hacer sql%k se sustituyen los
formatos por los valores correspondientes, resultando una cadena que luego se
ejecutará SIN PARÁMETROS, ya que los valores entran a formar parte intrínseca
de la sentencia sql (a mysql sólo se le pasa una cadena, sin parámetros).

Una ejecución con parámetros tendría que haber sido de ésta manera:

 sql = "insert into destinos values (%s,%s,%s,'3560');"
 db.query(sql,k[0],k[1],k[2])

%s indica la posición de los parámetros dentro de la sentencia sql. MySQL se
encargará de convertir éstos parámetros, escapando los apóstrofes y comillas
que podían dar problemas en la ejecución.

También se podría haber dado los parámetros directamente como una lista:

 db.query(sql,k)

Otra posibilidad es dar los parámetros por nombres, para lo que se usa un
diccionario:

 valores={"id":100,"nombre":"Fulano","telefonos":"34234 234 234"}
 sql="insert into destinos values (%(id)s,%(nombre)s,%(telefonos)s,'3560');"
 db.query(sql,valores)

Creo que el MySQLdb no tiene implementados el resto de modos de pasar
parámetros.

Con esto que te he contado creo que ya es suficiente para que sigas con tu
programa. Te aconsejo que hagas pruebas para ver el funcionamiento.




Más información sobre la lista de distribución Python-es