Duda con db.executesql

77 views
Skip to first unread message

BlackLion

unread,
Feb 16, 2012, 7:18:32 AM2/16/12
to web2py-usuarios
def rpd():
date=request.vars.fecha
shift=request.vars.turno
d10=db.executesql('SELECT n_disco_10 FROM linea_corte WHERE fecha
== "date" AND turno == "shift";')
d18=db.executesql('SELECT n_disco_18 FROM linea_corte ;')
return dict(d10=d10, d18=d18,date=date,shift=shift)

Con este código pretendo seleccionar un solo valor de la tabla
linea_corte, pero no entiendo por qué no selecciona ningún valor,
sabiendo que las variables date y shift son válidas y corresponden a
valores de la tabla. Básicamente el problema se presenta cuando coloco
"==", sin embargo esa es la única forma de seleccionar un solo valor,
si utilizo "<=", ">=", etc.. la instrucción selecciona varios valores
y eso no me funciona para lo que quiero que haga el programa.

Alan Etkin

unread,
Feb 16, 2012, 7:38:29 AM2/16/12
to web2py-usuarios
No veo la justificación de usar consultas nativas del motor de bases
de datos. Yo usaría el intérprete de DAL:

db(db.tabla.campo ...

De todos modos, cuando hacés un select, DAL devuelve una secuencia de
resultados, incluso cuando afecta a un solo registro (creo). Podés
acceder al primer resultado con el metodo .first() del resultado de la
consulta. Si la consulta no devolvió registros .first() devuelve None

BlackLion

unread,
Feb 16, 2012, 7:47:13 AM2/16/12
to web2py-usuarios
Utilizo el lenguaje nativo de la base de datos porque el usuario debe
tener la capacidad de consultar a cualquier campo de la tabla, no al
primero o al ultimo, lo otro es que yo comencé a hacer las consultas
con el intérprete DAL, pero no pude lograr recoger un solo registro de
la tabla

Joaquin Orbe

unread,
Feb 16, 2012, 9:03:01 AM2/16/12
to web2py-...@googlegroups.com

No deberia ser:

'SELECT n_disco_10 FROM linea_corte WHERE fecha = "date" AND turno = "shift";'

con un solo "=" ?

Saludos,
Joaco.

Omar Fariñez

unread,
Feb 16, 2012, 9:18:15 AM2/16/12
to web2py-...@googlegroups.com
Gracias por tu respuesta, sin embargo, con "=" o con "==", sigue sin funcionar :(

Joaquin Orbe

unread,
Feb 16, 2012, 9:33:24 AM2/16/12
to web2py-...@googlegroups.com
On Thu, Feb 16, 2012 at 11:18 AM, Omar Fariñez <omar.f...@gmail.com> wrote:
> Gracias por tu respuesta, sin embargo, con "=" o con "==", sigue sin
> funcionar :(

Que raro che. Podes mandar los resultados que te devuelve usando "<="?
y los valores que sacas de vars.

Omar Fariñez

unread,
Feb 16, 2012, 10:14:50 AM2/16/12
to web2py-...@googlegroups.com
Si es lo más sorprendente, de hecho los valores que recojo de vars los utilizo y se ven, pero cuando los utilizo para filtrar los registros que deseo ver de la tabla, no funciona y no entiendo por qué, ya no estoy usando executesql, ahora estoy utilizando el intérprete DAL, pero de igual forma los "validadores" cuando uso el simbolo de igualdad no sirven
--
Omar Fariñez

Joaquin Orbe

unread,
Feb 16, 2012, 10:31:27 AM2/16/12
to web2py-...@googlegroups.com

Si no me equivoco, los elementos de vars son strings. Haces la
conversion antes de comparar contra la columna fecha (siempre y cuando
fecha sea de tipo date)?

Omar Fariñez

unread,
Feb 16, 2012, 10:55:08 AM2/16/12
to web2py-...@googlegroups.com
Bueno lo que esta guardado en date tal ve sea string cuando lo recupero con vars, pero lo que esta en shift es string siempre y de igual forma no hace la comparacion

--
Omar Fariñez

Alan Etkin

unread,
Feb 16, 2012, 4:47:49 PM2/16/12
to web2py-usuarios
No sé si tiene que ver con el problema, pero creo que ..fecha = "date"
no se ve como un criterio de fecha válido, a menos que lo estés usando
como ejemplo unicamente o sea una palabra especial. Si estás usando
SQL tenés que usar un formato válido para especificar la fecha como
2012-02-16 o el formato que se utilice en el motor de la base de
datos. Si la consulta es con DAL, podrías pasar la fecha a un objeto
datetime.date para la comparación, aunque creo que DAL hace la
conversión automáticamente.

Omar Fariñez

unread,
Feb 17, 2012, 9:30:02 AM2/17/12
to web2py-...@googlegroups.com
En efecto el problema es que vars me trae la variable date como string y lo estoy comparando con una variable que es "date"(yyyy-mm-dd), la cuestión es que no se si haya alguna función o algo que me permita convertir esa variable de "string a date".

Mariano Reingart

unread,
Feb 17, 2012, 10:59:50 AM2/17/12
to web2py-...@googlegroups.com
Que base de datos estas usando?

Esto no va a funcionar nunca:

db.executesql('SELECT n_disco_10 FROM linea_corte WHERE fecha== "date"


AND turno == "shift";')

Por mas que tengas variables date y shift en tu controlador, le estas
pasando directamente cadenas "date" que no son reemplazadas ni por
web2py ni por ningun controlador de base de datos de python.

Podrias utilizarel formateo de texto de python, por ej: hacer "...
fecha = '%s' AND turno = '%s' " % (date, shift) , pero esto es
desaconsejable ya que te arriesgas a ataques de inyeccion de SQL.

Tendrías que usar consultas parametrizadas para que la base de datos
utilize las variables tuyas:

db.executesql('SELECT n_disco_10 FROM linea_corte WHERE fecha== ? AND
turno == ?;', [date, shift])

Dependiendo del controlador que uses, el ? debes cambiarlo por %s o
algun otro paramstyle (ver dbapi)

Como te comento alan, esto mismo lo podes hacer con la DAL sin
problemas y de una manera mas python sin escribir sql:

rows = db( (db.linea_corte.linea_corte==date) &&
(db.linea_corte.turno==turno) ).select(db.linea_corte.n_disco_10)

Sds

Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com

2012/2/17 Omar Fariñez <omar.f...@gmail.com>:

Gustavo Hernández Delgado

unread,
Feb 17, 2012, 12:42:29 PM2/17/12
to web2py-...@googlegroups.com

Hola a todos:

Mi aplicaci�n en desarrollo la copi� para el servidor de producci�n, ya
le d� los permisos, reinci� el servidor apache, y aparentemente todo
bien excepto que cuando trato de "loguearme", al poner usuario y
contrase�a vuelve a ponerme la pantalla del login incluso si lo dejo en
blanco me hace lo mismo sin emitir error de usuario no existe, etc,
modifiqu� un controlador para provocar error u cuando me devuelve el
ticket me hace referencia a la ip del servidor de desarrollo, hay alguna
relaci�n?, hay algo que deb�a haber cambiado y no lo hice?


saludos

Gustavo

Mariano Reingart

unread,
Feb 17, 2012, 1:35:35 PM2/17/12
to web2py-...@googlegroups.com
Una vez me pasó algo parecido ya que web2py tiene mecanismos para
prevenir doble envio de formularios y otros temas de seguridad, que si
hay algun inconveniente puede causar que no te tome el formulario.
Fijate si el servidor esta pudiendo grabar bien las sesiones, que no
tengas habilitada cache ni proxy, habilitá las cookies en tu
navegador, etc.

Sds

2012/2/17 Gustavo Hernández Delgado <gustavo....@etecsa.cu>:
>
> Hola a todos:
>
> Mi aplicación en desarrollo la copié para el servidor de producción, ya le
> dí los permisos, reincié el servidor apache, y aparentemente todo bien
> excepto que cuando trato de "loguearme", al poner usuario y contraseña


> vuelve a ponerme la pantalla del login incluso si lo dejo en blanco me hace

> lo mismo sin emitir error de usuario no existe, etc, modifiqué un


> controlador para provocar error u cuando me devuelve el ticket me hace

> referencia a la ip del servidor de desarrollo, hay alguna relación?, hay
> algo que debía haber cambiado y no lo hice?
>
>
> saludos
>
> Gustavo
> ---
> This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running
> at host imx2.etecsa.cu
> Visit our web-site: <http://www.kaspersky.com>, <http://www.viruslist.com>
>

Gustavo Hernández Delgado

unread,
Feb 17, 2012, 3:40:59 PM2/17/12
to web2py-...@googlegroups.com
El 17/02/12 13:35, Mariano Reingart escribió:
--- 
This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx3.etecsa.cu

    
Mariano:

Como siempre muchas gracias, muy oportuna la pista, al parecer era algo de eso por suerte es un servidor nuevo y por si acaso borré todo el web2py y lo volví a copiar publiqué y restart al apache y ya, al parecer era algo con las sesiones algo que copié y quedó colgado sin los permisos correspondientes

gracias nuevamente

Alan Etkin

unread,
Feb 17, 2012, 8:20:01 PM2/17/12
to web2py-usuarios
> no se si haya alguna función o algo que me permita convertir esa
> variable de "string a date".

datetime de Python tiene esta función:

datetime.strptime(string, format)

Que convierte una fecha como cadena a un objeto datetime. Format es
una cadena que especifica la estructura de la información. En esta
sección de la documentación oficial de Python tenés la codificación
para especificar formato de fechas.

http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior

Omar Fariñez

unread,
Feb 22, 2012, 6:58:33 AM2/22/12
to web2py-...@googlegroups.com
gracias por su ayuda, creo que logre resolver el problema utilizando request.post_vars:

    fech = request.post_vars.fecha
    turn = request.post_vars.turno
    lcf = db.linea_corte.fecha
    lct = db.linea_corte.turno
    
    d10 = db((lct == turn) & (lcf == fech)).select('n_disco_10')
    d18 = db((lct == turn) & (lcf == fech)).select('n_disco_18')
    d43 = db((lct == turn) & (lcf == fech)).select('n_disco_43')

el inconveniente ahora es que al parecer estoy contaminando la base de datos "linea_corte", cuando quiero ver todos los registros que estan guardados alli me da un error "<type 'exceptions.ValueError'> need more than 1 value to unpack"

Alan Etkin

unread,
Feb 22, 2012, 7:18:34 AM2/22/12
to web2py-usuarios
Qué consulta te da el error? Podés subir el traceback? Podría ser que
DAL no pueda convertir .fecha a datetime y que necesites convertir
antes de pasarlo a la consulta.

Omar Fariñez

unread,
Feb 22, 2012, 7:56:50 AM2/22/12
to web2py-...@googlegroups.com
Cierto disculpen, la consulta que me esta dando error es la siguiente:

query=((db.linea_corte))
    return dict(grid=SQLFORM.grid(query,create=False,editable=False,deletable=False,paginate=25))

Lo que pienso es que no tiene nada que ver con la primera consulta, lo cierto es que con esta deseo ver todos los datos de la tabla y que aparezca ordenado en una tabla, antes de colocar el código que mencione en mi mensaje anterior, se veía ahora no

Alan Etkin

unread,
Feb 22, 2012, 3:55:58 PM2/22/12
to web2py-usuarios
> query=((db.linea_corte))

La variable query refiere a un objeto tuple (creo), para que se
interprete como Query tendrías que declararla sin los paréntesis
externos:

query = db.linea_corte

O mejor:

query = db.linea_corte.id > 0
Reply all
Reply to author
Forward
0 new messages