Usando SQLite en Python

May 31, 2023 | Author: Anonymous | Category: N/A
Share Embed Donate


Short Description

Download Usando SQLite en Python...

Description

 

Cómo usar SQLite en Python  Python  SQLite  (para los que no la conocen) es una pequeña librería que nos permite manejar bases de datos SQLite relacionales y transaccionales, sin necesidad de servidor, sin configuración y almacenadas en un solo archivo en la máquina host.

En otras palabras, nuestra base de datos no es más que un archivo almacenado localmente al que nuestra aplicación tendrá acceso mediante llamadas a las rutinas de la librería. libr ería.

Pysqlite2 es un binding de SQLite para python y el sqlitebrowser es una aplicación que nos permitirá administrar la base de datos. Ejecutamos el browser desde un terminal: ter minal:

$ sqlitebrowser 

Vamos al menú File -> New Database para Database para crear una nueva base de datos, le indicamos la ruta y el nombre, para nuestro ejemplo será test.db test.db..

 

 

Luego, vamos al menú Edit -> Create Table y Table y creamos una nueva tabla llamada Usuarios Usuarios con  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 página web y almacenamos el número de visitas de cada uno:

 

Luego que estemos conformes hacemos click en el e l botón Create Create y  y guardamos los cambios en File -> Save Database.. Database

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

import sqlite3 

Hacemos la conexión:

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

La mayoría de las operaciones sobre la base de datos se hacen usando un cursor; un objeto que apunta a la base de datos y a través del cual podemos ejecutar instrucciones similares al SQL estándar (pero no idénticas) para obtener, insertar, actualizar o borrar registros.

cursor = connection.cursor() 

La forma recomendada es usar placeholders (marcadores de posición) puesto que si armamos la cadena usando variables de Python corremos el riesgo de que nos hagan  hagan  SQL Injection. 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 insípida tabla. Primero creamos un arreglo donde esté toda la información a insertar (en este caso es así porque vamos a insertar muchos datos, pero también podemos hacerlo uno por uno)

datos = [ ('Pedro Perez', 34, 'pperez@tuc '[email protected]', orreo.com', '', 4),

 

 

('Maria Gomez', 25, 'maria@sucor '[email protected]', reo.com', '', 7), ('Pablo Rodriguez', 41, 'pablor@elc '[email protected]', orreo.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, aún no hemos completado la tarea. SQLite es un  un  gestor transaccional  transaccional por lo que debemos realizar "la transacción" tr ansacción" usando el comando commit commit,, de lo contrario ningún cambio se hará efectivo sobre el archivo. Esto aplica para todas las operaciones que modifican la base de datos (léase INSERT, UPDATE, DELETE, etc).

connection.commit()  

Ahora veamos como obtener la información que acabamos de guardar. Esto es tan sencillo como estructurar la búsqueda 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 te rminal algo como:

(u'[email protected]', 34, 1, u'Pedro Perez', u'', 4) (u'[email protected]', 25, 2, u'Maria Gomez', u'', 7) (u'[email protected]', 41, 3, u'Pablo Rodriguez', u'www.pablo.com', 3) 

Y si queremos una búsqueda más específica 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 fácil como realizar una búsqueda pero usando el comando UPDATE;; le decimos qué tabla vamos a actualizar, los campos con sus nuevos valores y la condición que UPDATE identifica al registro. Para actualizar la edad de Pablo a 24 sería algo como:

values = (24, '[email protected]', '[email protected]', ) cursor.execute("UPDATE Usuarios SET edad=? WHERE correo=?", values) connection.commit()  

Donde values values es  es la tupla que se reemplazará donde están los placeholders. El motor de SQLite interpretará esa búsqueda como si le dijeramos:

cursor.execute("UPDATE Usuarios SET edad=24 WHERE correo='[email protected]'")  

La ventaja de los placeholders es que nos permiten crear instrucciones dinámicas y cambiar el contenido de la misma sin tener que estructurarla nuevamente (muy útil para usarla en bucles).

Pero ¿cómo 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 (nótese el nuevo valor de la edad de Pablo):

 

 

(u'[email protected]', 34, 1, u'Pedro Perez', u'', 4) (u'[email protected]', 25, 2, u'Maria Gomez', u'', 7) (u'[email protected]',

24,

3, u'Pablo Rodriguez', u'www.pablo.com',

3) 

Para borrar un registro se utiliza la instrucción DELETE DELETE seguida  seguida de la tabla y de la condición que identifica al registro. Borremos a todos los usuarios mayores de 34 de nuestro registro:

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

Y una vez más mostramos a todo el mundo:

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

Obteniendo:

(u'[email protected]', 25, 2, u'Maria Gomez', u'', 7) (u'[email protected]', 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@tuc '[email protected]', orreo.com', '', 4), ('Maria Gomez', 25, '[email protected]', '[email protected]', '', 7), ('Pablo Rodriguez', 41, 'pablor@elc '[email protected]', orreo.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@elco '[email protected]', rreo.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 cursor.exe cute("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()  

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF