148 lines
7.3 KiB
Markdown
148 lines
7.3 KiB
Markdown
# PROGRAMAR un simple y minimalista CRUD de acceso a datos con Python
|
|
|
|
## TAREAS :
|
|
|
|
- [X] traducidos los ficheros Java a Python scripts con funcionalidad equivalente (acceso a SQLite por un lado y a MongoDB por el otro )
|
|
|
|
- [ ] Testear / debug ?
|
|
|
|
- [ ] incorporar el uso de la librería Python 'Faker' (ver a continuación) para poblar las bases de datos con datos 'falsos' para test.
|
|
|
|
- [ ] elegir desplegar MongoDB via Docker o directamente en Linux (debian/ubuntu), de forma 'nativa'(ver fichero TAREAS.org)
|
|
|
|
## Recetas y pócimas Python
|
|
|
|
- [Uso de entornos virtuales mágicos](https://pythonisas.github.io/Pythonisas/entornos-virtuales-en-python.html)
|
|
- [Para tus bases de datos ...¿Generar datos de prueba aleatoriamente?](https://pythonisas.github.io/Pythonisas)
|
|
|
|
## Recursos
|
|
|
|
### En particular sobre la cuestión python + SQLite / mongoDB :
|
|
|
|
- [programando bases de datos SQLite, artículo del "El Libro de Python"](https://ellibrodepython.com/bases-datos-sqlite-python)
|
|
|
|
|
|
### En general sobre la cuestión :
|
|
|
|
- [Documentación Oficial en ES](https://docs.python.org/es/3/)
|
|
- ["Inventa tus propios juegos de computadora con Python"](https://inventwithpython.com/es/)
|
|
|
|
## Diagrama de flujo de los scripts Python :
|
|
|
|
La Base de Datos en ambos casos será unas simples tablas de 'alumnos' y 'profesores' siguiendo el patrón de lo programado en los ficheros Java de ejemplo (disponibles en este Proyecto)
|
|
|
|
```
|
|
╔═══════════════════════════════════╗
|
|
║ CRUD Minimalista con Python 🐍 ║
|
|
╚═══════════════╤═══════════════════╝
|
|
│
|
|
┌───────────┴───────────┐
|
|
│ TABLAS / Colecciones │
|
|
│ ┌─────────┐ ┌──────┐ │
|
|
│ │alumnos │ │profes │ │
|
|
│ └─────────┘ └──────┘ │
|
|
└───────────┬───────────┘
|
|
│
|
|
┌────────┴────────┐
|
|
│ C reate + R ead │
|
|
└────────┬────────┘
|
|
│
|
|
┌───────────────┴───────────────┐
|
|
│ │
|
|
┌───────┴────────┐ ┌────────┴───────┐
|
|
│ EJEMPLO A) │ │ EJEMPLO B) │
|
|
│ │ │ │
|
|
│ ┌──────────┐ │ │ ┌──────────┐ │
|
|
│ │ SQLite │ │ │ │ MongoDB │ │
|
|
│ │ .db │ │ │ │ { } │ │
|
|
│ └─────┬────┘ │ │ └─────┬────┘ │
|
|
│ │ │ │ │ │
|
|
│ ◄──►│ │ │ ◄──►│ │
|
|
│ │ │ │ │ │
|
|
│ ┌─────┴────┐ │ │ ┌─────┴────┐ │
|
|
│ │ Python │ │ │ │ Python │ │
|
|
│ │ sqlite3 │ │ │ │ pymongo │ │
|
|
│ └──────────┘ │ │ └──────────┘ │
|
|
└────────────────┘ └────────────────┘
|
|
SQL NoSQL
|
|
(Relacional) (Documentos)
|
|
```
|
|
|
|
## 📁 Estructura del Proyecto
|
|
|
|
|
|
|
|
```
|
|
programar-un-simple-y-minimalista-CRUD-de-acceso-a-datos-con-Python\
|
|
├── README.md ← este fichero
|
|
├── acceso-a-sqlite-via-java.jar ← ejemplo Java original (SQLite)
|
|
├── acceso-a-MongoDB-via-java.jar ← ejemplo Java original (MongoDB)
|
|
├── crud_sqlite.py ✅ Ejemplo A — funcional
|
|
├── crud_mongodb.py ✅ Ejemplo B — funcional (*)
|
|
└── dam.db ← BD SQLite generada automáticamente
|
|
```
|
|
|
|
> (*) `crud_mongodb.py` requiere una cadena de conexión a un servidor MongoDB válido (Atlas o local)
|
|
|
|
---
|
|
|
|
## EJEMPLO A): SQLite `<->` Python
|
|
|
|
📄 **Fichero:** `crud_sqlite.py`
|
|
🔧 **Dependencias:** ninguna (sqlite3 viene con Python)
|
|
|
|
```bash
|
|
python3 crud_sqlite.py
|
|
```
|
|
|
|
### ✅ Equivalencia Java → Python
|
|
|
|
| **Concepto Java** | **Equivalente Python** |
|
|
|:---------------------------------------|:------------------------------------------------|
|
|
| `DriverManager.getConnection(url)` | `sqlite3.connect(db_name)` |
|
|
| `Statement` / `PreparedStatement` | `cursor.execute()` con `?` placeholders |
|
|
| `ResultSet` + `rs.next()` | `cursor.fetchall()` + iteración |
|
|
| `pstmt.setString()` / `pstmt.setInt()` | tupla directa `(valor1, valor2)` |
|
|
| `try-with-resources` | `try/finally` + `conn.close()` |
|
|
| INSERT uno a uno con `executeUpdate()` | `executemany()` — inserta todos de una vez |
|
|
|
|
### 💡 Notas
|
|
|
|
- Python **no necesita driver externo** para SQLite (módulo `sqlite3` incluido en la stdlib)
|
|
- `executemany()` es más pythónico que insertar fila a fila como en Java
|
|
- La BD `dam.db` se recrea desde cero en cada ejecución
|
|
|
|
---
|
|
|
|
## EJEMPLO B): MongoDB `<->` Python
|
|
|
|
📄 **Fichero:** `crud_mongodb.py`
|
|
🔧 **Dependencias:** `pip install pymongo[srv]`
|
|
|
|
```bash
|
|
python3 crud_mongodb.py
|
|
```
|
|
|
|
### ✅ Equivalencia Java → Python
|
|
|
|
| **Concepto Java** | **Equivalente Python** |
|
|
|:-----------------------------------------------|:----------------------------------------|
|
|
| `MongoClients.create(configuracion)` | `MongoClient(CADENA_CONEXION)` |
|
|
| `baseDatos.runCommand(new Document("ping",1))` | `cliente.admin.command("ping")` |
|
|
| `clienteMongo.listDatabaseNames()` | `cliente.list_database_names()` |
|
|
| `baseDatos.listCollectionNames()` | `db.list_collection_names()` |
|
|
| `coleccion.find()` + bucle de claves | `coleccion.find()` + `doc.items()` |
|
|
| *(no existía en el Java)* | `$lookup` + `$unwind` (equivale a JOIN) |
|
|
|
|
### 💡 Notas
|
|
|
|
- La cadena de conexión del Java original (`clusterdam2025.9q7lm`) ya no está activa
|
|
- Para probar, cambiar `CADENA_CONEXION` por una conexión válida:
|
|
- **Atlas:** `mongodb+srv://user:pass@cluster.xxxxx.mongodb.net/`
|
|
- **Local:** `mongodb://localhost:27017`
|
|
- Se añadió un **`$lookup`** (equivalente a JOIN) que no existía en el Java, para mostrar alumnos con sus profesores — igual que en el ejemplo SQLite
|
|
- Las colecciones se recrean en cada ejecución (`drop()` + `insert_many()`)
|
|
|
|
|
|
|