[jython] insertar nulls en Access con jdbc (workaround)

Chema Cortes pych3m4 en gmail.com
Jue Oct 23 14:09:36 CEST 2008


El día 22 de octubre de 2008 15:32, lasizoillo <lasizoillo en gmail.com> escribió:
> On Wed, Oct 22, 2008 at 1:34 PM, Chema Cortes <pych3m4 en gmail.com> wrote:
>> Tengo un problema al insertar datos SQL NULL en base de datos MsAccess
>> (con jython y bridge jdbc:odbc).
>
> Segun el API de Java:
> http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html
> Note: Not all databases allow for a non-typed Null to be sent to the
> backend. For maximum portability, the setNull or the setObject(int
> parameterIndex, Object x, int sqlType) method should be used instead
> of setObject(int parameterIndex, Object x).
>
> Quizá haya otro driver jdbc que no tenga ese problema.

Estrictamente hablando, no es un driver jdbc. Es el puente entre jdbc
y odbc que ofrece Sun con el java. Con el resto de drivers jdbc que
uso no da problemas.

> Miranso el codigo del zxJDBC, parece que si pasas el parametro
> bindings con una lista de tipos, el sabe llamar a setNull cuando
> corresponde. Pero no se muy bien como se establece, la documentación
> es bastante fulera.

Pues así sí que parece funcionar. Se puede añadir dos parámetros al
.execute(), uno con un diccionario con los tipos SQL de los
parámetros, y otro para limitar el número de filas.

coltypes={0:db.NULL}
cur.execute("INSERT INTO tabla (campo1) values (?)",(None,),coltypes)


En realidad, como los datos me vienen de un select anterior a otra
base de datos, los tipos los obtengo así:

coltypes=dict([(i,d[1]) for (i,d) in enumerate(curorig.description)])

for r in curorig:
  cur.execute(qinsert, r, coltypes)


> ¿Que ventajas le ves a python-jdbc sobre algo puro en python? ¿Tienes
> mucho código en Java a parte de esto? Es solo curiosidad.

Creo que ya lo he comentado alguna vez. Tengo que acceder a varios
servidores de datos, diferentes en tipo y versión. Muchas veces
necesito instalar un montón de megas de ficheros para tan sólo usar el
driver odbc. El problema se acentúa cuando se actualizan los
servidores, lo que obliga a tener que instalar nuevos clientes,
algunos de ellos bastante inaccesibles de conseguir. En cambio con
jdbc es un único fichero, bastante fácil de obtener, y que basta con
incluirlo en el CLASSPATH del jython para que funcionen. Es posible
distribuir toda la aplicación en un sólo directorio con jython, con
todos los conectores y sin necesidad de instalar nada más (lo puedo
llevar en un pendisk).

Otras de las ventajas es el poder usar las librerías java desde
jython. Aunque todavía estoy aprendiendo, empleo jython+jdbc en
"Oracle Data Integrator" para acceso a fuentes de datos y para
scriptar.

Respondiendo a tu pregunta, no tengo código java propio. Todo lo que
necesito para java lo hago directamente en jython (por ejemplo,
servlets para tomcat).
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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