Total de niveles
Devolvé la suma de todos los niveles. Pista: SUM(nivel).
Entrá y llevá tu progreso —ejercicios, medallas y Pokémon— a cualquier dispositivo. 🔄
Si tu cuenta ya tiene progreso guardado, se carga ese al entrar.
Entraste como . Tu progreso se sincroniza solo. 🔄
Devolvé la suma de todos los niveles. Pista: SUM(nivel).
🎯 Meta: manejar la base desde Python con el módulo sqlite3: conectarte, ejecutar, traer resultados y guardar los cambios.
Ya sabés SQL. Ahora lo juntamos con Python: el módulo sqlite3 (que viene incluido con Python) te deja crear una base, ejecutar consultas y trabajar con los resultados en tu código.
import sqlite3
# ":memory:" = una base temporal en RAM (perfecta para practicar).
# En un proyecto real pondrías un archivo: sqlite3.connect("pokedex.db")
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE pokemon (nombre TEXT, nivel INTEGER)")
print("Conectado ✅")
💡 connect("archivo.db") crea/abre un archivo de base de datos real, que persiste aunque cierres el programa. :memory: desaparece al terminar.
execute corre la consulta. Para leer resultados: fetchone() (una fila) o fetchall() (todas).
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE pokemon (nombre TEXT, nivel INTEGER)")
con.executemany("INSERT INTO pokemon VALUES (?, ?)", [("Pikachu", 25), ("Charizard", 90)])
uno = con.execute("SELECT * FROM pokemon WHERE nombre = ?", ("Pikachu",)).fetchone()
print("uno:", uno) # ('Pikachu', 25) -> tupla, o None si no existe
todos = con.execute("SELECT nombre FROM pokemon").fetchall()
print("todos:", todos) # [('Pikachu',), ('Charizard',)]
P: ¿Cuál es la diferencia entre `sqlite3.connect(":memory:")` y `sqlite3.connect("pokedex.db")`?
- No hay diferencia, son equivalentes
- `:memory:` es más lento porque trabaja en disco
+ `:memory:` es temporal (desaparece al terminar); `pokedex.db` guarda en un archivo real
> `:memory:` crea la base de datos en la RAM — perfecta para practicar. Con un nombre de archivo, los datos **persisten** aunque el programa se cierre.
Cuando modificás datos (INSERT/UPDATE/DELETE) en un archivo, hay que confirmar con commit() para que queden guardados.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE pokemon (nombre TEXT, nivel INTEGER)")
con.execute("INSERT INTO pokemon VALUES (?, ?)", ("Eevee", 15))
con.commit() # ✅ guarda los cambios
print(con.execute("SELECT COUNT(*) FROM pokemon").fetchone()[0])
💡 También existe el cursor (cur = con.cursor()), una forma más explícita de ejecutar y leer: cur.execute(...) y después cur.fetchone(). Para lo básico, usar con.execute(...) directo alcanza.
P: Después de un `INSERT` en un archivo `.db`, ¿qué hay que hacer para que el dato quede guardado?
- Cerrar la conexión con `con.close()`
- Volver a abrir el archivo
+ Llamar a `con.commit()`
> Sin `commit()`, los cambios (INSERT/UPDATE/DELETE) quedan en una **transacción abierta** y se pierden al cerrar. `commit()` los confirma definitivamente.
| Cosa | Para qué |
|---|---|
sqlite3.connect(":memory:") | base temporal en RAM |
connect("archivo.db") | base en archivo (persistente) |
con.execute(sql, params) | ejecutar una consulta |
.fetchone() / .fetchall() | traer una fila / todas |
con.commit() | guardar los cambios |
Practicá con los ejercicios de este tema. 💪
⚡ “Python piensa, SQLite recuerda. Juntos, tu app no olvida nada.”