python sqlite

Poblando SQLite con valores aleatorios en Python

Siguiendo esta entrada seremos capaces de poblar una tabla creada en SQLite, cuyos valores (usuario, nombre, apellido, password, cédula, fecha nacimiento, sexo, etc…) de cada campo serán generados de forma aleatoria, es decir seleccionando un valor de un arreglo o un rango determinado. El encargado de hacer todo esto será un sencillo script en python que recibe como argumento la cantidad de inserciones que le queremos realizar a la base de datos, lal cual creará el script en caso de que no exista. Este código fue escrito originalmente para probar las capacidades de carga y volumen de SQLite, fue adaptado a esta entrada con fines didácticos.

Por lo tanto esta sencilla práctica nos servirá básicamente entre otras cosas para:

  • Aprender a usar SQLite con Python (conexión, crear tabla y hacer insert).
  • Aprender a generar o seleccionar valores aleatorios con Python.
  • Aprender a pasar y recibir argumentos en un script Python.
  • Otros tips sobre Python.

Python SQLite

Código Fuente

[sourcecode language=»python»]
#!/usr/bin/python
# -*- coding: utf-8 -*-
# como usar: $time python test-sqlite.py 1000
import sys, datetime, sqlite3, hashlib
from random import *

db = sqlite3.connect("populate.sqlite")
dbconn = db.cursor()

crear_tabla = "CREATE TABLE IF NOT EXISTS usuarios( id_usuario INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, usuario varchar NOT NULL,"
crear_tabla = crear_tabla + "passwd VARCHAR NOT NULL, nombre VARCHAR NOT NULL, apellido VARCHAR NOT NULL, cedula VARCHAR NOT NULL,"
crear_tabla = crear_tabla + " fecha_nacimiento DATETIME NOT NULL, sexo char NOT NULL, perfil VARCHAR NOT NULL)"
str(dbconn.execute(crear_tabla))

list_nombre = [‘Lenin’,’Ramiro’,’Alan’,’Rey’,’Elicer’,’Ana’,’Hugo’,’Ramon’,’Radames’,
‘Rosa’,’Dayana’,’Maria’,’Josefina’,’Pedro’,’Juan’,’Jose’,’Andres’,’Andrea’]
list_apellido = [‘Hernandez’,’Avalo’,’Rondon’,’Lima’,’Ponce’,’Gonzalez’,’Sifontes’,
‘Bello’,’Cardozo’,’Bermudez’,’Barreto’,’Fernandez’,’Delgado’,’Rodriguez’]

if len(sys.argv) >= 2:
print "A continuación se ingresaran ",sys.argv[1]," registros.";
else:
print "Este programa necesita el parámetro de cantidad de registros a ingresar. Abortando Operación.";
exit()

for i in range(int(sys.argv[1])):

fecha_nacimiento = datetime.datetime.today() – datetime.timedelta(days = randrange(1500, 25000))
nombre = choice(list_nombre)
apellido = choice(list_apellido)
cedula = str(randint(4000000, 21000000) )

sql = "INSERT INTO usuarios (‘usuario’,’passwd’,’nombre’, ‘apellido’, ‘cedula’, ‘fecha_nacimiento’, ‘sexo’, ‘perfil’) VALUES( "
sql = sql + "’" + nombre[0].lower() + apellido.lower() + "’"
sql = sql + ",’" + hashlib.md5(cedula).hexdigest() + "’"
sql = sql + ",’" + nombre +"’,’" + apellido + "’"
sql = sql + ",’" + cedula + "’"
sql = sql + ",’" + fecha_nacimiento.strftime(‘%Y-%m-%d’) + "’"
sql = sql + ",’" + choice([‘M’,’F’]) + "’"
sql = sql + ",’" + choice([‘ADMIN’,’ANALISTA’,’CONSULTA’]) + "’)"

try:
dbconn.execute(str(sql))
print "Se ingreso correctamente el registro Nº " + str(i+1) + ": " + nombre + " " + apellido
except:
print sql + "\n Ocurrió un error", "Guardando los datos del usuario."
exit()

db.commit()
[/sourcecode]

Indentación del Programa
Si copian y pegan el código anterior procuren mantener la indentación como la imagen que sigue, de lo contrario el script no correrá o tendrá comportamientos equívocos como salir del mismo sin hacer nada si los exit() quedan mal ubicados.

python sqlite
Identación en Python

Cómo usar
Copiar el código en un archivo de texto y colocar la extensión como .py, en un terminal ubicarse en la ruta donde esta el archivo y ejecutar el código fuente así:

lenin@i5:~$python nombre_archivo.py

Para efectos de pruebas y saber cuanto tiempo tarda (duración) en ejecutar el script se puede anteponer el comando time antes de la sentencia para saber esta información:

lenin@i5:~$time python nombre_archivo.py

Explicación del código fuente

Nota: La numeración presentada a continuación corresponde a las lineas de código presentadas anteriormente.

4 y 5: Importamos los módulos que contienen funcionalidades que necesitaremos en este script, como las de interactuar con SQLite, el módulo SYS con el cual podemos pasar valores como parámetros al script y luego tenerlos disponibles como variables, el uso de fechas gracias al módulo datetime, hashlib que nos permitirá calcular el MD5 de un número de cédula y el módulo random que nos permitirá usar las funciones de aleatoriedad de python como choise, randranrange y randint.

7 y 8: Nos conectamos a una base de datos de nombre populate.sqlite para los que no conocen mucho SQLite, esto no es mas que un archivo con este nombre en el mismo directorio donde sea ejecutado el script, si este archivo no existe sera creado al invocar la conexión. Este archivo es la base de datos y hasta este momento si es la primera vez en ejecutar el script no cuenta con ninguna estructura de base de datos (tablas, campos, relaciones etc…)

10 al 13: Creamos una variable donde almacenamos la sentencia sql para crear una tabla de nombre ‘usuarios’ con sus respectivos campos, luego ejecutamos esta sentencia para que la respectiva tabla sea creada en la base de datos seleccionada.

15 al 18: Se crea un arreglo con valores que son nombres y otro con apellidos, para luego seleccionarlos aleatoriamente.

20 al 24: Se valida si fue pasado como parámetro la cantidad de registros a insertar en la base de datos, de lo contrario el programa termina. En ambos casos se le muestra un mensaje al usuario.

26: Se crea un bucle tipo FOR que va desde 0 hasta el número que le fue pasado como argumento al programa. Dentro de este FOR se realizarán tantas inserciones en la base de datos como se le indico al programa al ejecutarlo.

28: La variable fecha_nacimiento almacenará una fecha que  tomando como base hoy (today) va aproximadamente desde hace cuatro años hasta casi 70 años.

29 y 30: La variable nombre y apellido usando la función choice seleccionarán aleatoriamente un elemento de los array declarados anteriormente para este propósito. Choice toma un valor aleatorio de un array pasado como argumento.

31: La variable cédula almacenará la elección aleatoria de un número entero entre 4000000 y 21000000.

33 a 40: Se crea la variable sql que almacenará la sentencia de inserción (insert) que se realizará en cada iteración del bucle, todos los valores a insertar serán tomados aleatoriamente de las condiciones ya vistas o las siguientes.

34: Para tomar el nombre de usuario capturo la primera letra del nombre y se concatena con el apellido, ambos son llevados a minúscula con la función lower.

35: Generamos el MD5 pasándole como parámetro la cédula generada anteriormente, con lo que las contraseñas de los usuarios serán su número de cédula.

38: Le damos el formato que necesitamos a la fecha para que sea insertada correctamente en el campo de tipo datetime. El formato será año-mes-dia (1999-05-12).

39 y 40: El sexo y perfil será seleccionado aleatoriamente de un array que definimos directamente dentro de la función choice.

42 al 47: Será ejecutada la consulta de inserción, si esta bien definida y no presenta error,  imprimirá en la consola que se ingreso correctamente cada número de registro, nombre y apellido. En caso contrario imprimirá el sql de la consulta para detectar el error,  y la ejecución del script terminará.

49: Se realizá commit a todas las operaciones insert que fueron ejecutadas, con lo cual todas serán asentadas correctamente a la base de datos.

lenin@i5:~$time python test-sqlite.py 10
A continuación se ingresaran  10  registros.
Se ingreso correctamente el registro Nº 1: Elicer Fernandez
Se ingreso correctamente el registro Nº 2: Andrea Rodriguez
Se ingreso correctamente el registro Nº 3: Radames Delgado
Se ingreso correctamente el registro Nº 4: Rey Rodriguez
Se ingreso correctamente el registro Nº 5: Dayana Gonzalez
Se ingreso correctamente el registro Nº 6: Rey Bermudez
Se ingreso correctamente el registro Nº 7: Hugo Ponce
Se ingreso correctamente el registro Nº 8: Radames Barreto
Se ingreso correctamente el registro Nº 9: Rosa Rodriguez
Se ingreso correctamente el registro Nº 10: Andrea Hernandez

real    0m0.137s
user    0m0.016s
sys    0m0.004s
lenin@i5:~$
python sqlite sqlitemanager
2 millones de registros en SQLite auto-generados con aleatoriedad en Python.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *