Conectando aplicación con base de datos relacional

Primero que todo debemos crear nuestra base de datos, en este caso estaré usando una base de datos local mysql llamada ejemplo que contiene 2 tablas:

Luego debemos crear nuestra aplicación:
/ejemplo
├── /app
│ ├── init.py
│ ├── models.py
│ ├── mysql_service.py
│ ├── /static
│ ├── /templates
│ └── config.py
├── main.py
└── start.sh
Puedes descargar este ejemplo y ver el paso a paso en github. Después debemos instalar las dependencias, para este proyecto solo usaremos: flask, mysqlclient, flask-SQLAlchemy, flask-marshmallow, -marshmallow-SQLAlchemy. Una vez instaladas las dependencias de la aplicación, debemos configurarla en el archivo config.py; debemos configurar nuestra SECRET_KEY y nuestra SQLALCHEMY_DATABASE_URI, esta ultima dependerá de la base de datos que vayamos a usar:

postgres://username:password@host:port/database
mysql://username:password@host:port/database
oracle://username:password@host:port/database


####
username: usuario de la base de datos
password: del usuario de la base de datos
host: 127.0.0.1 (localhost)
port: optional
database: nombre de la base de datos

Nuestro archivo config.py qudaria así:

class Config:
    SECRET_KEY = 'SUPER_SECRETO'
    SQLALCHEMY_DATABASE_URI = 'mysql://sebastian:supertiancho99@127.0.0.1/ejemplo'
# Init.py
from flask import Flask
from .config import Config

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)
    return app
# ahora debemos establecer los modelos de nuestra base de datos vamos a nuestro archivo models.py:
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Personas(db.Model):
    __tablename__ = 'personas'
    def __init__(self, id, nombre, apellido, locacion):
        self.id = id
        self.nombre = nombre
        self.apellido = apellido
        self.id_locacion = locacion

    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(100), nullable=False)
    apellido = db.Column(db.String(100), nullable=True)
    id_locacion = db.Column(db.Integer, db.ForeignKey('locaciones.id'))

class Locaciones(db.Model):
    __tablename__ = 'locaciones'
    def __init__(self, id, ciudad, estado):
        self.id = id
        self.ciudad = ciudad
        self.estado = estado

    id = db.Column(db.Integer, primary_key=True)
    ciudad = db.Column(db.String(100), nullable=False)
    estado = db.Column(db.String(100), nullable=False)
    persona = db.relationship('Personas', backref='persona', lazy=True)

Es necesario que cada modelo tenga su propio constructor y además el id de cada tabla tenga el nombre “id”, ya que así es como SQLAlchemy identifica la primary key. Es importante también definir las llaves foraneas y las relaciones, las relaciones nos permitirán hacer referencia desde locaciones hacia personas usando el backref. Pero SQLAlchemy() recibe como parametro la aplicacion entonces debemos ir a nuestro init.py y pasrle la app, agragamos al codigo que ya tenemos:

from .models import db
#dentro del método create app:
db.init_app(app)
#una vez hecho esto ya estaremos listos para acceder a la información de nuestra base de datos. Vamos a mysql_service y aqui vamos a definir y declarar nuestras funciones : una para insertar otra para borrar y otra para consultar (query):
from .models import db, Personas, Locaciones

def intert_persona(id, nombre, apellido, locacion):
    persona = Personas(id, nombre, apellido, locacion)
    db.session.add(persona)
    db.session.commit()

def delete_persona(id):
    persona = Personas.query.filter_by(id=id).first()
    db.session.delete(persona)
    db.session.commit()

def get_personas():
    persona = Personas.query.all()
    return persona

def get_persona(id):
    persona = Personas.query.filter_by(id=id).first()
    return persona

Es importante importar los modelos y el objeto db. Obviamente para poder insertar el registro debemos tener una «locacion» ya insertada a la que vamos a hacer referencia con la llave foránea de la persona, o simplemente la declaramos null usando None. importamos mysql_service.py donde queramos hacer las consultas y ya podremos llamar sus métodos:

from app.mysql_service import get_personas, get_persona, intert_persona, delete_persona
    intert_persona(1,'sebastian','hernandez', None)
    delete_persona(1)
    persona = get_persona(2)
    personas = get_personas()

El repositorio está en github github echenle un ojo a la documentación doc

Deja un comentario