Commit f46b09c5 authored by DANIEL DIAZ SANCHEZ's avatar DANIEL DIAZ SANCHEZ
Browse files

Update README.md, img/ORM.png files

parent 8ea056a1
......@@ -178,8 +178,156 @@ curl http://localhost:5000/estructurada
curl -X POST http://localhost:5000/persona
```
## Añadir una base de datos
## Añadir una base de datos al servicio REST en local
Seguro que a estas alturas te has podido hacer una idea de la facilidad de uso y de la potencia que tiene un API REST para su uso en cualquier contexto ya sea para aplicaciones web, movil o ambas dado que permite mantener un API actualizado con la lógica de negocio bien definida, mientras que la presentación puede abordarse individualmente según la tecnología y el dispositivo dónde debe mostrarse la aplicación.
Para darle algo más de utilizad, usaremos una base de datos.
Para darle algo más de utilizad, usaremos una base de datos. Esta base de datos se convertirá en otra distinta para la cloud más adelante.
Desde el diretorio `~/cdist` nos bajamos la utilidad de bases de dato en fichero `SQLite` y la descomprimimos de la siguiente manera:
```
(myenv) labgcd@vit131:~/cdist$ wget https://www.sqlite.org/2021/sqlite-tools-linux-x86-3360000.zip
(myenv) labgcd@vit131:~/cdist$ unzip sqlite-tools-linux-x86-3360000.zip
Archive: sqlite-tools-linux-x86-3360000.zip
creating: sqlite-tools-linux-x86-3360000/
inflating: sqlite-tools-linux-x86-3360000/sqlite3
inflating: sqlite-tools-linux-x86-3360000/sqlite3_analyzer
inflating: sqlite-tools-linux-x86-3360000/sqldiff
```
Entramos en la carpeta `~/cdist/rest`, creamos una base de datos ahí y *usando la consola, creamos una tabla llamada* `libro`, para ello, ejecutamos:
```
(myenv) labgcd@vit131:~/cdist$ cd rest
(myenv) labgcd@vit131:~/cdist/rest$ ../sqlite-tools-linux-x86-3360000/sqlite3 libros.sqlite
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> create table libro(id integer primary key, autor text, titulo text);
sqlite> .quit
```
Cambiamos el código por el siguiente:
```python
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///libros.sqlite"
db = SQLAlchemy(app)
class Libro(db.Model):
__tablename__ = 'libro'
id = db.Column(db.Integer, primary_key=True)
autor = db.Column(db.String(80), unique=True, nullable=False)
titulo = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<Libro %r>' % self.titulo
def serialize(self):
return {
"id": self.id,
"autor": self.autor,
"titulo": self.titulo
}
@app.route("/")
def wellcome():
return "Book database"
@app.route("/addbook", methods=['POST'])
def handle_addbook():
body = request.get_json()
if body is None:
return "The request body is null", 400
if 'autor' not in body:
return 'Author (autor) missing',400
if 'titulo' not in body:
return 'Title (titulo) missing', 400
nuevolibro = Libro(autor=body['autor'], titulo=body['titulo'])
db.session.add(nuevolibro)
db.session.commit()
return jsonify({"result": "Book added successfully!"}), 200
@app.route("/books", methods=['GET'])
def handle_getbooks():
all_books = Libro.query.all()
all_books = list(map(lambda x: x.serialize(), all_books))
return jsonify(all_books),200
@app.route("/book/<sid>", methods=['GET'])
def handle_getbook(sid):
book = Libro.query.filter_by(id=sid)
book = list(map(lambda x: x.serialize(), book))
return jsonify(book),200
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
```
Veamos las partes importantes:
1. Conexión con la base de datos SQLite en la que importamos flask_sqlalchemy, configuramos la URI de la base de datos (local y en fichero) con el driver `sqlite` y creamos la conexión `db = SQLAlchemy(app)`
```python
from flask_sqlalchemy import SQLAlchemy
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///libros.sqlite"
db = SQLAlchemy(app)
```
2. Creamos un ORM para libros en el que asociamos una base de datos con una tabla llamada `Libro` que ya hemos creado, con una clase llamada `Libro` que contiene todos sus campos usando ORM para no tener que tratar con sentencias SQL sino con objetos.
>>>
El mapeo objeto-relacional (más conocido por su nombre en inglés, Object-Relational mapping, o sus siglas O/RM, ORM, y O/R mapping) es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y la utilización de una base de datos relacional como motor de persistencia. (Wikipedia -- https://es.wikipedia.org/wiki/Asignaci%C3%B3n_objeto-relacional)
>>>
<img src="img/ORM.png" width="500px"/>
```python
class Libro(db.Model):
__tablename__ = 'libro'
id = db.Column(db.Integer, primary_key=True)
autor = db.Column(db.String(80), unique=True, nullable=False)
titulo = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<Libro %r>' % self.titulo
def serialize(self):
return {
"id": self.id,
"autor": self.autor,
"titulo": self.titulo
}
```
3. Ejemplo de como añadir un elemento a la base de datos en el que se obtienen los parámetros contenidos en el cuerpo de la petición `POST` que son `autor` y `titulo` en `nuevolibro = Libro(autor=body['autor'], titulo=body['titulo'])` y se crea un objeto de clase `Libro`. Dicho objeto se añade a la base de datos `db.session.add(nuevolibro)` y se persisten los cambios `db.session.commit()`:
```python
@app.route("/addbook", methods=['POST'])
def handle_addbook():
body = request.get_json()
if body is None:
return "The request body is null", 400
if 'autor' not in body:
return 'Author (autor) missing',400
if 'titulo' not in body:
return 'Title (titulo) missing', 400
nuevolibro = Libro(autor=body['autor'], titulo=body['titulo'])
db.session.add(nuevolibro)
db.session.commit()
return jsonify({"result": "Book added successfully!"}), 200
```
4. Busqueda de elementos en la base de datos en la que en un caso se buscan todos `all_books = Libro.query.all()` y se formatean para su presentación (respuesta con Json) `all_books = list(map(lambda x: x.serialize(), all_books))` y en otro caso se busca un libro en concreto tomando como parámentro de la URL el identificador del libro (`sid`) en `book = Libro.query.filter_by(id=sid)`.
img/ORM.png

26.5 KB

Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment