diff --git a/README.md b/README.md index af0c9b0..b3bc833 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,145 @@ -# programar-un-simple-y-minimalista-CRUD-de-acceso-a-datos-con-Python +# 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. + +## 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()`) + + -Programando un simple y minimalista CRUD de acceso a datos con Python. - -Partiendo la traducción de ficheros Java a Python scripts con funcionalidad equivalente (acceso a SQLite por un lado y a MongoDB por el otro ) -