[Python-es] Django , error de enconding(?)

Oswaldo Hernández listas en soft-com.es
Mie Feb 9 17:50:57 CET 2011


El 09/02/2011 16:49, Manuel A. Estevez Fernandez escribió:
 > El 09/02/11 08:48, Oswaldo Hernández escribió:
 >> El 09/02/2011 2:21, Manuel A. Estevez Fernandez escribió:
 >>> Hola ...
.....
 >
 > Sin embargo no he encontrado qué es lo que representa ese E'cadena'.

La forma E'cadena' vendria a ser similar a lo que en python seria r'cadena'.

 >
 > cursor.execute("""select * from
 > (select id_archivo_id,id_emite_id,nombre,rfc
 > from facturas_facturas f join facturas_entes e on(f.id_emite_id=e.id))
 > as q0
 > join
 > (select id_archivo_id,id_recibe_id,nombre as cliente,rfc as
 > rfc_cliente,serie,folio,fecha, total
 > from facturas_facturas f join facturas_entes e on(f.id_recibe_id=e.id))
 > as q1
 > using(id_archivo_id)
 > where lower(serie||folio) like lower('%%%s%%')
 > or lower(rfc_cliente) like lower('%%%s%%')
 > or lower(rfc) like lower('%%%s%%')
 > or lower(cliente) like lower('%%%s%%')
 > or lower(nombre) like lower('%%%s%%')
 > order by fecha
 > """, [ consulta,consulta,consulta,consulta,consulta ])
 >
 > Es como viene recomendado en la documentación de Django.
 >

No hay que confundir el '%s' que utiliza el driver postgresql (supongo 
que django usa psycopg2) para sustituir los parámetros con el '%s' 
normal de python, no actúan exactamente igual.

Al especificar %s en la sentencia sql *nunca* debes incluir las 
comillas, el driver ya se encarga se ponerlas cuando es necesario. De 
esta forma el sql: "like lower(%s)" queda como "like 
lower(E'parametro')". Esta es la forma correcta para evitar problemas de 
sql-inyection.

En tu caso lo que quieres es agregar los simbolos '%' para modificar el 
funcionamiento de 'like', para ello, o bien modificas el parámetro 
agregandole los simbolos para que el driver ya haga la systitucion con 
ellos, o los pones en el sql de forma que junte las cadenas, algo como 
"like lower('%'||%s||'%')"



-- 
Oswaldo Hernández


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