Foros del Web » Programando para Internet » Python »

Insert en la base de datos

Estas en el tema de Insert en la base de datos en el foro de Python en Foros del Web. Buenos días, me pasa una cosa curiosa cuando quiero hacer un INSERT en una base de datos mysql. si hago lo siguiente: cursor.execute("insert into tabla ...
  #1 (permalink)  
Antiguo 17/04/2012, 03:11
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 7 meses
Puntos: 0
Insert en la base de datos

Buenos días,
me pasa una cosa curiosa cuando quiero hacer un INSERT en una base de datos mysql.


si hago lo siguiente:

cursor.execute("insert into tabla (a,b) values (null,'rrr');")

NO hace el insert en la base de datos

Si hago lo siguiente:

cursor.execute("insert into tabla (a,b) values (null,'rrr');")
conexion.commit();

SI hace el insert en la base de datos.

1.- Es necesario el commit para hacer el insert en la base de datos?
2.- Si hago un insert sin commit y luego hago un insert con el commit en el autoincrement de mi tabla se incrementa (sin haber puesto los valores anteriores)
  #2 (permalink)  
Antiguo 17/04/2012, 07:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Insert en la base de datos

Cita:
Iniciado por xinxan22 Ver Mensaje
1.- Es necesario el commit para hacer el insert en la base de datos?
Si, si es necesario. No se que base de datos estés usando, pero también le puedes activar el autocommit.

Cita:
Iniciado por xinxan22 Ver Mensaje
2.- Si hago un insert sin commit y luego hago un insert con el commit en el autoincrement de mi tabla se incrementa (sin haber puesto los valores anteriores)
Si, esto es normal en cualquier base de datos.

Otra cosa no hagas esto es feo y propenso a errores.

Código Python:
Ver original
  1. cursor.execute("insert into tabla (a,b) values (null,'rrr');")

Mejor haz esto:
Código Python:
Ver original
  1. cursor.execute("insert into tabla (a,b) values (%s,%s);", (None, 'rrr'))
En caso de sqlite reemplaza %s con ?
  #3 (permalink)  
Antiguo 17/04/2012, 08:11
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Insert en la base de datos

Muchas gracias.

Respeto al caso 2.-, lo que veo raro es que si hago INSERTS sin el coomit en la base de datos (es mysql) no aparen. Si lanzo luego el commit, aparecen pero el autoincrement se ha hecho, es decir:

Mysql:
id=1
id=2

Codigo:
insert...
insert...
commit

Mysql:
id=1
id=2
id=3 (insertado)
id=4 (insertado)

Codigo:
insert
(sin commit)

Mysql:
id=1
id=2
id=3
id=4

Codigo:
insert
commit

Mysql:
id=1
id=2
id=3
id=4
id=6 (insertado)

Entonces... donde está el id=5 ??
  #4 (permalink)  
Antiguo 17/04/2012, 08:50
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Insert en la base de datos

Deberías leer sobre Transacciones, que eso es lo que estás viendo.

Una transacción, en jerga databasera, es una secuencia de consultas que se realizan en bloque, de tal forma que o se realizan todas o no se realiza ninguna.

Normalmente comienza con BEGIN y termina con COMMIT (para guardar los cambios) o ROLLBACK (para descartarlos). Hace ya varios años escribí un artículo al respecto, espero que te pueda aclarar un poco el asunto: http://blog.elcodiguero.com/mysql/8-...-en-mysql.html

No sé qué has hecho en el medio entre el insert sin commit y el insert con commit, pero supongo que descartaste la sesión (de otra forma, sería igual al caso donde insertaste los id 4 y 5), y eso hizo un rollback automático, o quizás estás haciendo las cosas desde dos sesiones diferentes a la BBDD.

Yo diría que el primer commit tomó y reservó el ID 5, y eso fue considerado por el segundo aunque el primero no estuviese guardado. Si fuese de otra forma, el segundo también tendría ID 5, y al guardarlos a ambos terminarías con un error de datos: dos registros con el mismo ID o un error de consistencia al guardar uno de los registros.

De nuevo, lee sobre transacciones para entenderlo mejor, lo que ves no es un comportamiento extraño.

Lo que te sugiere razpeitia es el uso de "Prepared Statements": consultas parametrizadas de tal forma que es el motor de base de datos el que se encarga de colocar correctamente los valores en la consulta. Esto evita, por sí mismo, un montón de problemas de seguridad que uno puede crear sin querer al escribir la consulta concatenando los valores.


Saludos.
  #5 (permalink)  
Antiguo 17/04/2012, 08:54
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Insert en la base de datos

Si, he estado leyendo y entiendo que eso pasaría si utilizara transacciones, pero no estoy usando, bien, uso commit porque veo que sino, no se inserta en la tabla.
  #6 (permalink)  
Antiguo 17/04/2012, 09:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Insert en la base de datos

Cita:
Iniciado por xinxan22 Ver Mensaje
Si, he estado leyendo y entiendo que eso pasaría si utilizara transacciones, pero no estoy usando, bien, uso commit porque veo que sino, no se inserta en la tabla.
En casi cualquier base de datos relacional (si incluso sqlite), estas usando transacciones por defecto, pero regularmente lo manejan de manera transparente (haciendo la falsa ilusión de que no las estas usando).

Si tu haces un select * from table, este query va en una transacción y es totalmente transparente para ti.

Aquí hay mas razones.

Etiquetas: gui, insert
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:52.