import sqlite3 # Importamos el módulo 'sqlite3' para interactuar con la base de datos SQLite (equivalente a usar PDO con MySQL en PHP) class PersonaModel: # Constructor de la clase, se ejecuta al crear una instancia (equivalente a __CONSTRUCT en PHP) def __init__(self): # Definimos el nombre del archivo de la base de datos self.db_name = 'database.db' # Llamamos al método para inicializar la base de datos si no existe self.init_db() # Método para crear la tabla si no existe (en PHP solíamos tener un script SQL separado, aquí lo hacemos por código) def init_db(self): # Usamos 'with' para manejar la conexión. Se conecta y se desconecta automáticamente al terminar el bloque. # Es más seguro que abrir y cerrar manualmente (en PHP: $pdo = new PDO(...)) with sqlite3.connect(self.db_name) as conn: # Creamos un cursor, que es el objeto que nos permite ejecutar comandos SQL cursor = conn.cursor() # Ejecutamos la consulta SQL para crear la tabla 'persona' # Usamos IF NOT EXISTS para que no de error si ya existe cursor.execute(''' CREATE TABLE IF NOT EXISTS persona ( idpersona INTEGER PRIMARY KEY AUTOINCREMENT, -- ID autoincremental nombres TEXT NOT NULL, -- Campo de texto obligatorio cedula TEXT NOT NULL, -- Campo de texto obligatorio fecha_nmto TEXT NOT NULL, -- Campo de texto (fecha) direccion TEXT NOT NULL, -- Campo de texto email TEXT NOT NULL -- Campo de texto ) ''') # Guardamos los cambios en la base de datos (commit) conn.commit() # Método para listar todos los registros (equivalente a Listar() en PHP) def listar(self): try: # Abrimos conexión a la base de datos with sqlite3.connect(self.db_name) as conn: # Configuramos para que los resultados se comporten como diccionarios/arrays asociativos # Esto permite acceder a los campos por nombre (ej: fila['nombres']), similar a PDO::FETCH_OBJ o PDO::FETCH_ASSOC conn.row_factory = sqlite3.Row cursor = conn.cursor() # Ejecutamos la consulta SELECT cursor.execute("SELECT * FROM persona") # fetchall() recupera TODAS las filas encontradas y las retorna como una lista return cursor.fetchall() except Exception as e: # Si ocurre un error, lo imprimimos en la consola print(f"Error al listar: {e}") return [] # Retornamos una lista vacía en caso de error # Método para obtener una sola persona por su ID (equivalente a Getting($id) en PHP) def obtener(self, idpersona): try: with sqlite3.connect(self.db_name) as conn: conn.row_factory = sqlite3.Row cursor = conn.cursor() # Usamos ? como marcador de posición para evitar Inyección SQL (Prepared Statements) # Es idéntico a usar prepare() y execute() en PDO de PHP cursor.execute("SELECT * FROM persona WHERE idpersona = ?", (idpersona,)) # fetchone() recupera SOLO la primera fila encontrada return cursor.fetchone() except Exception as e: print(f"Error al obtener: {e}") return None # Método para eliminar un registro (equivalente a Eliminar($id) en PHP) def eliminar(self, idpersona): try: with sqlite3.connect(self.db_name) as conn: cursor = conn.cursor() # Ejecutamos la sentencia DELETE usando parámetros seguros cursor.execute("DELETE FROM persona WHERE idpersona = ?", (idpersona,)) # ¡Importante! En INSERT/UPDATE/DELETE siempre debemos hacer commit() para guardar cambios conn.commit() except Exception as e: print(f"Error al eliminar: {e}") # Método para guardar (Registrar o Actualizar) # Recibe todos los campos necesarios. En PHP recibíamos un objeto $data, aquí argumentos individuales def guardar(self, idpersona, nombres, cedula, fecha_nmto, direccion, email): try: with sqlite3.connect(self.db_name) as conn: cursor = conn.cursor() # Verificamos si hay un ID válido para decidir si es ACTUALIZAR o INSERTAR # Equivalente a: $alm->idpersona > 0 ? Actualizar() : Registrar() if idpersona and int(idpersona) > 0: # Lógica de ACTUALIZAR (UPDATE) sql = '''UPDATE persona SET nombres = ?, cedula = ?, fecha_nmto = ?, direccion = ?, email = ? WHERE idpersona = ?''' # Pasamos los valores en una tupla, incluyendo el ID al final cursor.execute(sql, (nombres, cedula, fecha_nmto, direccion, email, idpersona)) else: # Lógica de REGISTRAR (INSERT) sql = "INSERT INTO persona (nombres, cedula, fecha_nmto, direccion, email) VALUES (?, ?, ?, ?, ?)" # Pasamos los valores en una tupla cursor.execute(sql, (nombres, cedula, fecha_nmto, direccion, email)) # Confirmamos la transacción conn.commit() except Exception as e: print(f"Error al guardar: {e}")