Re: Re: "create database" not allowed within transaction

Milton inostroza <[email protected]> Thu, 12 May 2005 11:33:22 -0400
Newsgroups gmane.comp.python.db.pypgsql.user
Message-ID <[email protected]>
El 12/05/05, Milton inostroza<[email protected]> escribi=F3:
 >     db =3D PgSQL.connect(...)
 >     db.autocommit =3D True
 Debes tener cuidado con esta linea db.autocommit=3DTrue, ya que si
 quieres insertar por ejemplo en 3 tablas y est=E1s est=E1n relacionadas te
producir=E1n un gran dolor de cabeza...observa:
=20
 table direccion, table trabajador, el trabajador tiene una direccion y
 direccion puede tener a uno o muchos trabajadores (esta es la
 relacion), entonces en codigo quedar=EDa de la siguiente manera
=20
try:
        insertar en direccion
        insertar en trabajador (utilizando la pk de direccion como fk
       en trabajador)
except:
       sys.exc_info()[1] (imprime el tipo de exception)
=20
 ahora, pregunta que pasa al utilizar db.autocommit=3DTrue....imaginate
 que en direccion se inserte todo bien y en trabajador exista un
 problema (imaginate que existe un campo int y el usuario lo ingresa
 como cadena) entonces trabajador no se inserta y te manda la exception
 (ahi todo bien)....PERO esto es erroneo ya que ingresaste una
 direccion pero no a un trabajador ahora con autocommit el rollback no
 funciona, entonces te quedaste con una direccion que no es de nadie y
 eso es un ERROR GRAVE en un sistema de verdad.
=20
   En mi sistema elimine el autocommit=3DTrue y trabajo de esta forma, me
 da menos dolores de cabeza y la curva de verificaciones de datos
 decrece un monton (cantidad de if para verificar que los campos sean
 correctos).
=20
 bueno ahi va el codigo
=20
 db =3D PgSQL.connect(...)
 cursor=3Ddb.cursor()
=20
 try:
         sql =3D"""
                  INSERT INTO direccion
                  (nombre_comuna,nombre_calle_direccion,
                   numero_direccion,block_direccion,
                   departamento_direccion
                  )
                  VALUES ('%s','%s','%s','%s','%s')
                  """%(
                  self.comboboxentryComuna.child.get_text().upper(),
                  self.entryCalle.get_text().upper(),
                  self.entryNumero.get_text(),
                  self.entryBlock.get_text().upper(),
                  self.entryDepartamento.get_text()
                  )
         cursor.execute(sql)
=20
         sql =3D"""
                  INSERT INTO trabajador
                  VALUES("""+ ",".join(["'%s'" %(n1) for n1 in trabajador])=
+")"
         self.cursor.execute(sql)
=20
         db.commit()
 except:
         print sys.exc_info()[1]
         db.rollback()
=20
 db.close()
=20
 si te das cuenta realizo un commit() cuando todas las inserciones se
 realizan de forma satisfactoria, en el except pongo imprimir el error
 y un rollback para eliminar cualquier transaccion que se haya
 realizado y que no me sirva, ejemplo:  que se haya insertado bien
 direccion y mal trabajador, ESO no me sirve entonces aplico un
 rollback().
=20
 my language is Spanish-Chile, I did not write in ingles because it was
 occupied making a task.  I hope that my aid serves to you.
=20
 --
 Milton Inostroza Aguilera
 Secretario Academico Centro de Alumnos
 Encargado de Auspicios y Patrocinios - 6to. Encuentro Nacional de Linux
 Desarrollador de RemuneX (sistema de remuneraciones amparado bajo GPL)


-------------------------------------------------------
This SF.Net email is sponsored by Oracle Space Sweepstakes
Want to be the first software developer in space?
Enter now for the Oracle Space Sweepstakes!
http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click