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