domingo, 14 de febrero de 2010

MySQL y Python - Relación de pura potencia y 3

Inserción, actualización y borrado de filas: INSERT, UPDATE y DELETE.

Efectivamente podemos utilizar las instrucciones insert, update y delete vía módulo MySQLdb. En este apartado podemos ver 3 casos a la hora de la construcción de la sentencia:

1) Sentencia SQL sin parámetros (SQL estático). La sentencia se puede crear como una cadena de caracteres, sin incluir ningún tipo de valor o variable ó construcción adicional. Por ejemplo:

# -*- coding: cp1252 -*-
# Importamos módulo
import MySQLdb

# Intentamos conectar con la base de datos.
try:
conexion = MySQLdb.connect(host = "localhost", \
user = "root", passwd = "1234",db = "pruebas_python")
print "Conexión realizada"
except:
print "Error en conexión"

# Creamos cursor a partir de la conexión realizada.
cursor = conexion.cursor()

# Creamos sentencia SQL.
cadenaSQL = 'update cliente set nombre = "G. Almaraz" where id = 12'

# Ejecutamos sentencia SQL.
try:
cursor.execute(cadenaSQL)
conexion.commit()
except:
conexion.rollback()

# Cerramos conexión
conexion.close()
Cambiamos, en la fila con id = 12, el contenido del campo nombre (antes tenía la cadena 'Gabriela' y ahora 'G. Almaraz'). Como podemos observar siempre hay que cerrar una conexión, mediante el método close del objeto conexion. Cuando ejecutamos la sentencia SQL, si todo ha ido bien, hacemos commit, de lo contrario, rollback.

2) Sentencia SQL con parámetros (SQL dinámico). En este caso la sentencia SQL no está formada previamente por defecto, sino que necesita de unos datos adicionales para poder formar dicha sentencia. Por ejemplo:

# Creamos cursor a partir de la conexión realizada.
cursor = conexion.cursor()

# Pedimos datos.
nombre = raw_input("Introduce nombre: ")
ciudad = raw_input("Introduce ciudad: ")

# Creamos cadena de inserción.
cadenaSQL = 'insert into cliente (nombre, ciudad) values (%s, %s)'

# Ejecutamos
try:
cursor.execute(cadenaSQL, (nombre, ciudad))
conexion.commit()
except:
print "Hubo Error"
conexion.rollback()

# Cerramos conexión
conexion.close()

En este caso ciertos valores de la sentencia SQL son introducidos por el usuario. %s se utiliza para representar cada variable en la sentencia SQL, y cuyos valores están guardados en una tupla pasada como segundo argumento al método execute del objeto cursor.

3) Sentencias SQL que se ejecutan múltiples veces. En ocasiones se presenta el crear una sentencia SQL (como un insert, por ejemplo) y ejecutarla una y otra vez con diferentes valores. El módulo MySQLdb viene integrado con un método, denominado executemany, el cual simplifica la tarea y reduce costes de tiempos. El ejemplo siguiente lo aclara todo:

# Creamos cursor a partir de la conexión realizada.
cursor = conexion.cursor()

# Creamos lista de datos.
lista_datos = [('nombre1', 'ciudad1'),('nombre2', 'ciudad2'),('nombre3', 'ciudad3')]

# Creamos cadena de inserción.
cadenaSQL = 'insert into cliente (nombre, ciudad) values (%s, %s)'

# Ejecutamos
try:
cursor.executemany(cadenaSQL, lista_datos)
conexion.commit()
except:
print "Hubo Error"
conexion.rollback()

# Cerramos conexión
conexion.close()
Mediante executemany hacemos 3 inserts de golpe (uno tras otro), en una única sentencia.

El origen de datos es una lista de tuplas. Cada elemento de la lista es una tupla que contiene los valores para cada iteración. Cada tupla es una fila.

Último ID incremental

En caso de tener campos de autoincremento en una tabla, se puede utilizar el método
insert_id del objeto conexion para obtener el identificador de la última fila insertada. Esto es interesante si necesitamos dicha información para relacionar unas tablas con otras a través de identificadores foráneos y cosas por el estilo.

El siguiente ejemplo lo aclara todo:


# Creamos cursor a partir de la conexión realizada.
cursor = conexion.cursor()

# Creamos cadena de inserción.
cadenaSQL = 'insert into cliente (nombre, ciudad) values ("FIN","FIN")'

# Ejecutamos
try:
cursor.execute(cadenaSQL)
id = int(
conexion.insert_id())
conexion.commit()
# Obtenemos el último identificador incremental de la última fila insertada.
print "ID de la última fila insertada: ", str(id)
except:
print "Hubo Error"
conexion.rollback()

# Cerramos conexión
conexion.close()
Este código, si hemos realizado los ejemplos al pie de la letra y sin equivocarnos, debe de dar como resultado lo siguiente:

Conexión realizada
ID de la última fila insertada: 17

Ahora nuestra tabla ejemplo debe de estar con los siguientes datos:

No hay comentarios:

Publicar un comentario