File size: 5,986 Bytes
e09caf0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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}")