Pydal + oracle + uso de campos tipo Blob

Amm-Python python en ammsoft.com
Mie Ago 31 14:31:18 CEST 2005


Buenas a todos.

Pydal es un módulo muy interesante para compatibilizar las aplicaciones
python con cualquier tipo de base de datos.

Estoy haciendo pruebas con Oracle + pydal y tengo los siguientes
problemas que no consigo solucionar:

1.- Campos BLOB
Intento actualizar un registro que contiene una foto con una nueva.
Si utilizo cx_Oracle, directamente, cuando añado un registro con un
campo blob hago lo siguiente:
...                
f = open('nombre de la imagen.jpg', "rb")
im = f.read()
f.close()
                     
CurFot.setinputsizes(imagen = cx_Oracle.BLOB)
CurFot.execute("""
                   update fotografias set
                   fot_fecha = :fecha,
                   fot_imagen = :imagen
                   where fot_id= :id""",
                   id = IdEmpleado,
                   fecha =cx_Oracle.Timestamp(t.tm_year, t.tm_mon,
t.tm_mday,
                   t.tm_hour, t.tm_min, t.tm_sec),
                   imagen = im)
                   myDBs.commit()

Si uso DAL utilizando paramstyle 'qmark' e intento hacer lo siguiente:

CurFot.execute("""
                  update fotografias set
                  fot_fecha = ?,
                  fot_imagen = ? 
                  where fot_id= ?""" , 
                  [datetime.datetime(t.tm_year, t.tm_mon, t.tm_mday,
                  t.tm_hour, t.tm_min, t.tm_sec),
                  im,IdEmpleado])
                                
                  myDBs.commit()

Se pierde la foto !!!!!, además no se genera ningún error.

Como creo que el problema está en que no se ha especificado el inpusize
del campo he intentado utilizar la función
Bynary de DAL pero me dice que el módulo no tiene esa propiedad.

Hay alguna solución solución?
Nota: Si hago un insert para crear un nuevo registro, el resultado es el
mismo, es decir; un registro con una foto pero que no se ha guardado
bien.
Que pasará con los campos blob de otros tipos de bases de datos?

2.- DAL por lo que he podido apreciar no soporta Win32con.client
Es decir que no podemos acceder a bases de datos mediante ADO de
microsoft.
Estoy en lo cierto?
Hay alguna manera de acceder a una base de datos Access con pydal?
Con el módulo PDO si se puede, o al menos eso dice la documentación.
Pero es un módulo que no me termina de convencer.

3.- He intentado usar paramstyle 'pyformat' y 'named' con pydal y Oracle
y no consigo que funcione.
Ejemplo:

>>> import dal
>>> dbdriver = dal.wrapdriver("cx_Oracle")
>>> dbdriver.paramstyle = 'named'
>>> con = dbdriver
>>> db = con.connect("system/master en database")
>>> cur = db.cursor()
>>> res = cur.execute('select * from operadores where
op_codigo=:code',{'code':'ADMIN'})
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "C:\Python23\lib\site-packages\dal\dbapi\dbapi.py", line 297, in
execute
    newquery, newparams = self.__formatQueryParams(query, params)
  File "C:\Python23\lib\site-packages\dal\dbapi\dbapi.py", line 414, in
__formatQueryParams
    params = dbtime.dtsubnative(self._mwrapper.dtmod, self._driver,
params)
  File "C:\Python23\lib\site-packages\dal\dbapi\dbtime.py", line 220, in
dtsubnative
    param = params[pcnt]
KeyError: 0

Por lo que tengo entendido los parametros en PYDAL deben pasarse como
una lista []
Pero si lo hago me dice que debo pasar un diccionario

>>> res = cur.execute('select * from operadores where
op_codigo=:code',[{'code':'ADMIN'}])
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "C:\Python23\lib\site-packages\dal\dbapi\dbapi.py", line 298, in
execute
    return self._native_cs.execute(newquery, newparams)
TypeError: expecting a dictionary

Si en lugar de tipo parametro 'named' utilizo 'qmark' funciona bien.
>>> dbdriver.paramstyle = 'qmark'
>>> cur.close()
>>> cur = db.cursor()
>>> res = cur.execute('select * from operadores where
op_codigo=?',['ADMIN'])

A mi personalmente no me gusta el estilo qmark, por lo que agradecería
que alguien me diga que hago mal.

Saludos.




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