Sie sind auf Seite 1von 8

Cmo usar SQLite en Python

SQLite (para los que no la conocen) es una pequea librera que nos permite manejar bases de datos

relacionales y transaccionales, sin necesidad de servidor, sin configuracin y almacenadas en un solo archivo

en la mquina host.

En otras palabras, nuestra base de datos no es ms que un archivo almacenado localmente al que nuestra

aplicacin tendr acceso mediante llamadas a las rutinas de la librera.

Pysqlite2 es un binding de SQLite para python y el sqlitebrowser es una aplicacin que nos permitir

administrar la base de datos. Ejecutamos el browser desde un terminal:

$ sqlitebrowser

Vamos al men File -> New Database para crear una nueva base de datos, le indicamos la ruta y el

nombre, para nuestro ejemplo ser test.db.


Luego, vamos al men Edit -> Create Table y creamos una nueva tabla llamada Usuarios con los

siguientes campos:

id -> INTEGER PRIMARY KEY


nombre -> TEXT
edad -> NUMERIC
correo -> TEXT
url -> TEXT
visitas -> NUMERIC

Imaginemos que esta tabla es para manejar un sistema donde registraremos a los usuarios que visitan

nuestra pgina web y almacenamos el nmero de visitas de cada uno:


Luego que estemos conformes hacemos click en el botn Create y guardamos los cambios en File -> Save

Database.

Lo primero que necesitamos para conectarnos a esa base de datos es importar la librera:

import sqlite3

Hacemos la conexin:

connection = sqlite3.connect('test.db')

La mayora de las operaciones sobre la base de datos se hacen usando un cursor; un objeto que apunta a la

base de datos y a travs del cual podemos ejecutar instrucciones similares al SQL estndar (pero no

idnticas) para obtener, insertar, actualizar o borrar registros.

cursor = connection.cursor()

La forma recomendada es usar placeholders (marcadores de posicin) puesto que si armamos la cadena

usando variables de Python corremos el riesgo de que nos hagan SQL Injection. Es decir, en lugar de hacer

esto:

user = 'pedro'
cursor.execute("SELECT * FROM tabla WHERE usuario = '%s'" % user)

Debemos usar tuplas y hacer esto:

user = ('pedro',)
cursor.execute('SELECT * FROM tabla WHERE usuario =?', t)

Insertemos entonces algunos datos para rellenar esa inspida tabla. Primero creamos un arreglo donde est

toda la informacin a insertar (en este caso es as porque vamos a insertar muchos datos, pero tambin

podemos hacerlo uno por uno)

datos = [
('Pedro Perez', 34, 'pperez@tucorreo.com', '', 4),
('Maria Gomez', 25, 'maria@sucorreo.com', '', 7),
('Pablo Rodriguez', 41, 'pablor@elcorreo.com',
'www.pablo.com', 3),
]

Ahora usamos un iterador para recorrer el arreglo e insertarlo:


for t in datos:
cursor.execute('INSERT INTO Usuarios
(nombre,edad,correo,url,visitas) VALUES (?,?,?,?,?)', t)

Pero esperen, an no hemos completado la tarea. SQLite es un gestor transaccional por lo que debemos

realizar "la transaccin" usando el comando commit, de lo contrario ningn cambio se har efectivo sobre el

archivo. Esto aplica para todas las operaciones que modifican la base de datos (lase INSERT, UPDATE,

DELETE, etc).

connection.commit()

Ahora veamos como obtener la informacin que acabamos de guardar. Esto es tan sencillo como estructurar

la bsqueda y ejecutarla.

Primero veamos como listar todos los registros:

cursor.execute('SELECT * FROM Usuarios')


for row in cursor:
print row

Esto nos imprime en el terminal algo como:

(u'pperez@tucorreo.com', 34, 1, u'Pedro Perez', u'', 4)


(u'maria@sucorreo.com', 25, 2, u'Maria Gomez', u'', 7)
(u'pablor@elcorreo.com', 41, 3, u'Pablo Rodriguez', u'www.pablo.com',
3)

Y si queremos una bsqueda ms especfica podemos hacer algo como lo siguiente para buscar el nombre y

las visitas de todos los registros con id igual a 1:


id = (1, )
cursor.execute("SELECT nombre, visitas FROM Usuarios
WHERE id=?", id)
for row in cursor:
print "%s ha realizado %i visitas" % (row[0],
row[1])

Para obtener:

Pedro Perez ha realizado 4 visitas

Vamos ahora a actualizar un registro. Es tan fcil como realizar una bsqueda pero usando el comando

UPDATE; le decimos qu tabla vamos a actualizar, los campos con sus nuevos valores y la condicin que

identifica al registro. Para actualizar la edad de Pablo a 24 sera algo como:

values = (24, 'pablor@elcorreo.com', )


cursor.execute("UPDATE Usuarios SET edad=? WHERE correo=?", values)
connection.commit()

Donde values es la tupla que se reemplazar donde estn los placeholders. El motor de SQLite interpretar

esa bsqueda como si le dijeramos:

cursor.execute("UPDATE Usuarios SET edad=24 WHERE


correo='pablor@elcorreo.com'")

La ventaja de los placeholders es que nos permiten crear instrucciones dinmicas y cambiar el contenido de

la misma sin tener que estructurarla nuevamente (muy til para usarla en bucles).

Pero cmo sabemos que realmente se actualiz el registro? Pues sencillo, listemos de nuevo todos los

registros:

cursor.execute('SELECT * FROM Usuarios')


for row in cursor:
print row

Y en el terminal veremos algo como (ntese el nuevo valor de la edad de Pablo):


(u'pperez@tucorreo.com', 34, 1, u'Pedro Perez', u'', 4)
(u'maria@sucorreo.com', 25, 2, u'Maria Gomez', u'', 7)
(u'pablor@elcorreo.com', 24, 3, u'Pablo Rodriguez', u'www.pablo.com',
3)

Para borrar un registro se utiliza la instruccin DELETE seguida de la tabla y de la condicin que identifica al

registro. Borremos a todos los usuarios mayores de 34 de nuestro registro:

value = (34,)
cursor.execute("DELETE FROM Usuarios WHERE edad >= ?", value)
connection.commit()

Y una vez ms mostramos a todo el mundo:


cursor.execute('SELECT * FROM Usuarios')
for row in cursor:
print row

Obteniendo:

(u'maria@sucorreo.com', 25, 2, u'Maria Gomez', u'', 7)


(u'pablor@elcorreo.com', 24, 3, u'Pablo Rodriguez', u'www.pablo.com',
3)

Programa final:

# -*- coding: utf-8 -*-


# Importamos la libreria de SQLite
import sqlite3

# Creamos la conexion
connection = sqlite3.connect('test.db')

# Creamos el cursor
cursor = connection.cursor()

# Creamos el arreglo que contiene toda la informacion


datos = [
('Pedro Perez', 34, 'pperez@tucorreo.com', '', 4),
('Maria Gomez', 25, 'maria@sucorreo.com', '', 7),
('Pablo Rodriguez', 41, 'pablor@elcorreo.com',
'www.pablo.com', 3),
]

# Insertamos todos los registros


for t in datos:
cursor.execute('INSERT INTO Usuarios
(nombre,edad,correo,url,visitas) VALUES (?,?,?,?,?)', t)

# Hacemos efectiva la transaccion


connection.commit()

# Imprimimos todos los registros


print "\nLista de todos los registros de la base de
datos:"
cursor.execute('SELECT * FROM Usuarios')
for row in cursor:
print row

# Imprimimos solo el registro que tenga id = 1


id = (1, )
cursor.execute("SELECT nombre, visitas FROM Usuarios
WHERE id=?", id)
for row in cursor:
print "\n%s ha realizado %i visitas" % (row[0],
row[1])

# Actualizamos la edad de Pablo


values = (24, 'pablor@elcorreo.com', )
cursor.execute("UPDATE Usuarios SET edad=? WHERE
correo=?", values)
connection.commit()
print "\nActualizada la edad de Pablo"
# Y volvemos a imprimir todos los registros para
verificar los cambios
print "\nRegistros de la base de datos despues de
actualizar a Pablo:"
cursor.execute('SELECT * FROM Usuarios')
for row in cursor:
print row

# Borramos todos los registros con edades mayores de 34


anios
value = (34,)
cursor.execute("DELETE FROM Usuarios WHERE edad >= ?",
value)
connection.commit()
print "\nBorrados todos los ancianos ;)"

# E imprimimos otra vez todos los registros para


verificar los cambios
print "\nRegistros de la base de datos despues de borrar
a los viejitos:"
cursor.execute('SELECT * FROM Usuarios')
for row in cursor:
print row

# Finalmente cerramos todo como debe ser


cursor.close()
connection.close()

Das könnte Ihnen auch gefallen