En este post te enseñaré un ejercicio de programación simple con Python y la base de datos SQLite3. Se trata de implementar un diccionario de palabras en esta base de datos a través de una aplicación por consola.
El programa debe permitir agregar una nueva palabra con su significado, ver las palabras, editar el significado de una palabra, ver el significado de una palabra y eliminar una palabra.
Todas las palabras serán guardadas en una tabla dentro de una base de datos de SQLite3 usando Python, además de que no se van a permitir palabras repetidas.
Veamos cómo resolver este ejercicio de programación.
Conexión a SQLite3 y creación de tablas
En mi blog ya he tocado el tema de la conexión desde Python a este motor de base de datos, en una ocasión con una app por consola y en otra con una API REST usando Flask.
El código para conectarnos a la base de datos y crear las tablas en caso de que no existan queda así:
import sqlite3
NOMBRE_BASE_DE_DATOS = "diccionario.db"
def obtener_conexion():
return sqlite3.connect(NOMBRE_BASE_DE_DATOS)
def crear_tablas():
tablas = [
"""
CREATE TABLE IF NOT EXISTS diccionario(
id INTEGER PRIMARY KEY AUTOINCREMENT,
palabra TEXT NOT NULL,
significado TEXT NOT NULL
);
"""
]
conexion = obtener_conexion()
cursor = conexion.cursor()
for tabla in tablas:
cursor.execute(tabla)
Funciones del diccionario
Voy a crear funciones que van a permitir todas las operaciones del diccionario, como agregar palabras, eliminarlas, editarlas, etcétera (según los requisitos listados al inicio).
Todos los métodos quedan como se ve a continuación. Lo que se repite es obtener la base de datos y el cursor:
def agregar_palabra(palabra, significado):
conexion = obtener_conexion()
cursor = conexion.cursor()
sentencia = "INSERT INTO diccionario(palabra, significado) VALUES (?, ?)"
cursor.execute(sentencia, [palabra, significado])
conexion.commit()
def editar_palabra(palabra, nuevo_significado):
conexion = obtener_conexion()
cursor = conexion.cursor()
sentencia = "UPDATE diccionario SET significado = ? WHERE palabra = ?"
cursor.execute(sentencia, [nuevo_significado, palabra])
conexion.commit()
def eliminar_palabra(palabra):
conexion = obtener_conexion()
cursor = conexion.cursor()
sentencia = "DELETE FROM diccionario WHERE palabra = ?"
cursor.execute(sentencia, [palabra])
conexion.commit()
def obtener_palabras():
conexion = obtener_conexion()
cursor = conexion.cursor()
consulta = "SELECT palabra FROM diccionario"
cursor.execute(consulta)
return cursor.fetchall()
def buscar_significado_palabra(palabra):
conexion = obtener_conexion()
cursor = conexion.cursor()
consulta = "SELECT significado FROM diccionario WHERE palabra = ?"
cursor.execute(consulta, [palabra])
return cursor.fetchone()
Cada función recibe los argumentos necesarios. Por ejemplo para buscar el significado de una palabra en este diccionario con Python y SQLite3 se requiere la palabra en sí, luego se hace una consulta y se regresa el resultado.
Fíjate en que estoy usando sentencias preparadas para evitar inyecciones SQL (por eso es que invoco a execute
pasando los valores como lista en lugar de concatenar las variables).
Menú
Las operaciones de este diccionario con Python deben ser expuestas a través de un menú que se ejecuta en la consola. El mismo queda así:
def principal():
crear_tablas()
menu = """
a) Agregar nueva palabra
b) Editar palabra existente
c) Eliminar palabra existente
d) Ver listado de palabras
e) Buscar significado de palabra
f) Salir
Elige: """
eleccion = ""
while eleccion != "f":
eleccion = input(menu)
if eleccion == "a":
palabra = input("Ingresa la palabra: ")
# Comprobar si no existe
posible_significado = buscar_significado_palabra(palabra)
if posible_significado:
print(f"La palabra '{palabra}' ya existe")
else:
significado = input("Ingresa el significado: ")
agregar_palabra(palabra, significado)
print("Palabra agregada")
if eleccion == "b":
palabra = input("Ingresa la palabra que quieres editar: ")
nuevo_significado = input("Ingresa el nuevo significado: ")
editar_palabra(palabra, nuevo_significado)
print("Palabra actualizada")
if eleccion == "c":
palabra = input("Ingresa la palabra a eliminar: ")
eliminar_palabra(palabra)
if eleccion == "d":
palabras = obtener_palabras()
print("=== Lista de palabras ===")
for palabra in palabras:
# Al leer desde la base de datos se devuelven los datos como arreglo, por
# lo que hay que imprimir el primer elemento
print(palabra[0])
if eleccion == "e":
palabra = input(
"Ingresa la palabra de la cual quieres saber el significado: ")
significado = buscar_significado_palabra(palabra)
if significado:
print(f"El significado de '{palabra}' es:\n{significado[0]}")
else:
print(f"Palabra '{palabra}' no encontrada")
Es un simple menú en donde solicitamos al usuario que seleccione la letra dependiendo de la opción, y a partir de ello solicitamos más datos, invocamos a las funciones previamente mostradas, etcétera.
El menú se va a mostrar hasta que el usuario seleccione la letra que termina el programa.
Poniendo todo junto
En esta ocasión no he separado el código, así que todo está en un mismo archivo. Recuerda que tú puedes modificarlo y adaptarlo a tus necesidades como casi todo lo publicado en este blog.
"""
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
____________________________________
/ Si necesitas ayuda, contáctame en \
\ https://parzibyte.me /
------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Creado por Parzibyte (https://parzibyte.me).
------------------------------------------------------------------------------------------------
Si el código es útil para ti, puedes agradecerme siguiéndome: https://parzibyte.me/blog/sigueme/
Y compartiendo mi blog con tus amigos
También tengo canal de YouTube: https://www.youtube.com/channel/UCroP4BTWjfM0CkGB6AFUoBg?sub_confirmation=1
------------------------------------------------------------------------------------------------
"""
import sqlite3
NOMBRE_BASE_DE_DATOS = "diccionario.db"
def obtener_conexion():
return sqlite3.connect(NOMBRE_BASE_DE_DATOS)
def crear_tablas():
tablas = [
"""
CREATE TABLE IF NOT EXISTS diccionario(
id INTEGER PRIMARY KEY AUTOINCREMENT,
palabra TEXT NOT NULL,
significado TEXT NOT NULL
);
"""
]
conexion = obtener_conexion()
cursor = conexion.cursor()
for tabla in tablas:
cursor.execute(tabla)
def principal():
crear_tablas()
menu = """
a) Agregar nueva palabra
b) Editar palabra existente
c) Eliminar palabra existente
d) Ver listado de palabras
e) Buscar significado de palabra
f) Salir
Elige: """
eleccion = ""
while eleccion != "f":
eleccion = input(menu)
if eleccion == "a":
palabra = input("Ingresa la palabra: ")
# Comprobar si no existe
posible_significado = buscar_significado_palabra(palabra)
if posible_significado:
print(f"La palabra '{palabra}' ya existe")
else:
significado = input("Ingresa el significado: ")
agregar_palabra(palabra, significado)
print("Palabra agregada")
if eleccion == "b":
palabra = input("Ingresa la palabra que quieres editar: ")
nuevo_significado = input("Ingresa el nuevo significado: ")
editar_palabra(palabra, nuevo_significado)
print("Palabra actualizada")
if eleccion == "c":
palabra = input("Ingresa la palabra a eliminar: ")
eliminar_palabra(palabra)
if eleccion == "d":
palabras = obtener_palabras()
print("=== Lista de palabras ===")
for palabra in palabras:
# Al leer desde la base de datos se devuelven los datos como arreglo, por
# lo que hay que imprimir el primer elemento
print(palabra[0])
if eleccion == "e":
palabra = input(
"Ingresa la palabra de la cual quieres saber el significado: ")
significado = buscar_significado_palabra(palabra)
if significado:
print(f"El significado de '{palabra}' es:\n{significado[0]}")
else:
print(f"Palabra '{palabra}' no encontrada")
def agregar_palabra(palabra, significado):
conexion = obtener_conexion()
cursor = conexion.cursor()
sentencia = "INSERT INTO diccionario(palabra, significado) VALUES (?, ?)"
cursor.execute(sentencia, [palabra, significado])
conexion.commit()
def editar_palabra(palabra, nuevo_significado):
conexion = obtener_conexion()
cursor = conexion.cursor()
sentencia = "UPDATE diccionario SET significado = ? WHERE palabra = ?"
cursor.execute(sentencia, [nuevo_significado, palabra])
conexion.commit()
def eliminar_palabra(palabra):
conexion = obtener_conexion()
cursor = conexion.cursor()
sentencia = "DELETE FROM diccionario WHERE palabra = ?"
cursor.execute(sentencia, [palabra])
conexion.commit()
def obtener_palabras():
conexion = obtener_conexion()
cursor = conexion.cursor()
consulta = "SELECT palabra FROM diccionario"
cursor.execute(consulta)
return cursor.fetchall()
def buscar_significado_palabra(palabra):
conexion = obtener_conexion()
cursor = conexion.cursor()
consulta = "SELECT significado FROM diccionario WHERE palabra = ?"
cursor.execute(consulta, [palabra])
return cursor.fetchone()
if __name__ == '__main__':
principal()
Probando diccionario de palabras en Python
Al ejecutar el código todas las opciones funcionan:
Si te gusta Python te invito a ver más proyectos que he creado con ese lenguaje en mi blog.