Sqlite en Python
Bueno, como dice el título, mostraré en un pequeño ejemplo como se puede trabajar con abses de datos sqlite, usar un bucle para matener el trabajo abierto y condicionales para seleccionar la tarea.
El programa trabaja de la siguiente forma:
1.- Importamos los módulos deseados
2.- Comprobamos si existe la base de datos, si no existe la creamos, para ello generamos una conexión al archivo de la base de datos (si no existe lo crea). Recordemos que sqlite mantiene los datos en un simple archivo. Tendremos una tabla notas y una tabla direcciones. En notas almacenaremos texto al azar, mientras que en direcciones almacenaremos direcciones web y una descripción de la misma (Piensen que es un sistema de favoritos…)
3.- Creamos un cursor, ese cursor sera el objeto por el cual manejaremos TODO lo referido a la base de datos.
4.- Creamos un loop While que siempre es verdadero (CUIDADO DE NO HACER UN LOOP INFINITO POR NO COLOCAR UNA OPCION QUE LO CORTE).
5.- Dentro del Loop, mostramos las opciones y luego el usuario ira ingresando las mismas. Cada opcion lleva a una respectiva acción. El código esta bastante comentado así que leyendo se entiende.
6.- Vemos que dentro de algunas acciones hay bucles while con break, la sentencia anterior corta el bucle while en la cual está anidado. Recordar esto ya que es muy importante.
Con el paso de los días ire explicando más correctamente el tutorial. Archivo de ejemplo (usen el nombre que quieran)
# -*- coding: utf8 -*-
"""Modulo de ejemplo de sqlite y condicionales en Python.
:author: Angelus_ira
:version: 0.1"""
__docformat__ = "restructuredtext"
# Importamos el modulo sqlite3
import sqlite3
# Importamos el modulo os
import os
# Importamos el modulo sys, lo usare para algunos detalles
import sys
# Importamos HttpUrl del modulo lelp de python
# http://pypi.python.org/pypi/LEPL/
# La validación de la url podria hacerse con una regex pero
# ya que el modulo esta, para que evitarlo...
from lepl.apps.rfc3696 import HttpUrl
# Comprobamos si existe la base de datos
if not os.path.exists('test.db'):
#Creamos la nueva base de datos
connection = sqlite3.connect('test.db')
#Creamos las tablas necesarias
connection.execute('''CREATE TABLE direcciones
(id INTEGER NOT NULL,
url VARCHAR(255),
site_desc TEXT,
PRIMARY KEY (id ASC),
UNIQUE (url)) ''')
connection.execute('''CREATE TABLE notas
(id INTEGER NOT NULL,
texto_nota TEXT,
PRIMARY KEY (id ASC)) ''')
else:
#Usamos la BD existente
connection = sqlite3.connect('test.db')
# Trabajamos con sqlite3.Row, esto nos permite usar los nombres de las
# columnas de la base de datos para obtener informacion
connection.row_factory = sqlite3.Row
# Creamos un cursor, es el objeto que nos sirve p enviar consultas a la bd
cursor = connection.cursor()
#compilamos los validadores
valid_http_url = HttpUrl()
#Bucle de la aplicacion, correra hasta que se use el break correspondiente
while True:
break
opciones = '''
===============================
Agenda de LINKS y DATOS
===============================
Menu
-------------------------------
1-Ingresar Direccion Web
2-Ingresar Texto
3-Ver la Base de URL
4-Ver la Base de Texto
5-Borrar la Base de Datos
S-Salir
'''
print(opciones)
print(sys.stdout.encoding)
#El usuario selecciona la opcion
preg = raw_input("Opcion: ")
#Limpiamos la pantalla una vez que el usuario hizo enter en la opción
#deseada
os.system('cls')
#El usuario trabaja con la agenda de direcciones web. En otras palabras
#la tabla direcciones.
if preg == '1':
while True:
#El usuario ingresa la direccion
url = raw_input("nIngrese direccion de pagina:n")
#comprobamos que es una url valida
if valid_http_url(url):
#verificamos que no existe la direccion
cursor.execute('SELECT * FROM direcciones WHERE url =?', (url, ))
url_data=cursor.fetchone()
if url_data!=None:
print('Ya existe esa dirección! no repita')
else:
descripcion = raw_input("nIngrese descripción de pagina:nn")
cursor.execute('INSERT INTO direcciones (url, site_desc) VALUES (?,?)',
(url, descripcion))
else:
print('Ha ingresado una url invalida')
insertar_url = raw_input("nIngresar otra página (S/N):n")
if insertar_url != 'S':
#vemos que el break siempre corta el bucle mas cercano
break
#Una vez que se agregaron todas las notas deseadas, procedemos
#con la grabación de los datos en la BD, para ello usamos commit
connection.commit()
elif preg == '2':
while True:
#El usuario ingresa la nota, aqui no comprobamos la existencia
#ya que son solo notas y no importa.
nota = raw_input("nIngrese el texto, para salto de lineas use \n:n")
#verificamos que no existe la direccion
cursor.execute('INSERT INTO notas (texto_nota) VALUES (?)', (nota, ))
insertar_texto = raw_input("nIngresar otra nota (S/N):n")
if insertar_texto != 'S':
break
connection.commit()
elif preg == '3':
print('Direcciones almacenadas')
#Obtenemos la totalidad de las url guardadas
cursor.execute('SELECT * FROM direcciones')
for rec in cursor:
#.decode('string_escape') se utiliza para que muestre la string con
#salto de linea...
print('Direccion '+ rec['url']+'nDescripcion: '+rec['site_desc'].decode('string_escape'))
print('n-------------------n')
elif preg == '4':
print('Notas almacenadas')
#Obtenemos la totalidad de las url guardadas
cursor.execute('SELECT * FROM notas')
for rec in cursor:
print('Nota:n' + rec['texto_nota'].decode('string_escape'))
print('n-------------------n')
elif preg == '5':
borrar = ''
while True:
print('Borrar Bases de Datos n')
print('1.- Direcciones n')
print('2.- Notas n')
print('3.- Volver n')
borrar = raw_input("nElegir opcion (1,2,3):n")
if borrar == '1':
#vacio tabla direcciones
cursor.execute('DELETE from direcciones')
connection.commit()
print('Se ha vaciado la base de datos de Direccioens n')
if borrar == '2':
#vacio tabla notas
cursor.execute('DELETE from notas')
connection.commit()
print('Se ha vaciado la base de datos de Notas n')
if borrar == '3':
break
elif preg == 'S':
saludo = '''
========================================
USTED ESTA SALIENDO DE LA AGENDA
========================================
Hasta la proxima
----------------------------------------
'''
print(saludo)
#Modificamos la variable programa, con ello deja de cumplirse el
#condicional del bucle while
break
else:
Error = '''
========================================
USTED ESTA SALIENDO DE LA AGENDA
========================================
Hasta la proxima
----------------------------------------
'''
os.system('color C')
os.system('cls')
print(Error)
raw_input("Presione cualquier tecla para volver al Menu")
os.system('color 7')