class CategoriaModel(bd.Model): __tablename__ = "t_categoria" categoriaId = bd.Column( name="categoria_id", # Nombre de la col en la bd type_=bd.Integer, # tipo de dato en la bd primary_key=True, # setear si es PK(True) o no (False) autoincrement=True, # setear si va a autoincrementarse nullable=False, # seter si va a admitir valores nulos o no unique=True # si no se va a repetir el valor ) categoriaDescripcion = bd.Column(name="categoria_descripcion", type_=bd.String(45), nullable=False, unique=True) # esto no crea las relaciones simplemente sirve para le momento de hacer consultas con JOIN's libros = relationship('LibroModel', backref='categoriaLibro', lazy=True) def __init__(self, nombre): self.categoriaDescripcion = nombre def save(self): bd.session.add(self) bd.session.commit() def json(self): return { 'categoria_id': self.categoriaId, 'categoria_nombre': self.categoriaDescripcion, }
class SedeModel(bd.Model): __tablename__ = "t_sede" sedeId = bd.Column(name="sede_id", type_=bd.Integer, primary_key=True, autoincrement=True, unique=True) sedeUbicacion = bd.Column(name="sede_ubicacion", type_=bd.String(45)) # con el tipo de dato DECIMAL se pueden indicar el total de numeros y el total de decimales # https://docs.sqlalchemy.org/en/13/core/type_basics.html?highlight=datatypes#sql-standard-and-multiple-vendor-types sedeLatitud = bd.Column(name="sede_latitud", type_=bd.DECIMAL(9,7), nullable=False) sedeLongitud = bd.Column(name="sede_longitud", type_=bd.DECIMAL(9,7), nullable=False) libros = relationship('SedeLibroModel', backref='sedeLibro') def __init__(self, ubicacion, latitud, longitud): self.sedeUbicacion = ubicacion self.sedeLatitud = latitud self.sedeLongitud = longitud def save(self): bd.session.add(self) bd.session.commit() def json(self): return { 'sede_id': self.sedeId, 'sede_ubicacion': self.sedeUbicacion, 'sede_latitud': str(self.sedeLatitud), 'sede_longitud': str(self.sedeLongitud) }
class AutorModel(bd.Model): # para cambiar el nombre de la tabla a crearse __tablename__ = "t_autor" autorId = bd.Column( name="autor_id", # Nombre de la col en la bd type_=bd.Integer, # tipo de dato en la bd primary_key=True, # setear si va a ser pk o no autoincrement=True, # setear si va a ser AI o no nullable=False, # setear si va a admitir valores nulos o no unique=True, # si no se va a repetir el valor o no ) autorNombre = bd.Column(name="autor_nombre", type_=bd.String(45)) # si no indicamos un backref flask lo generara alteatoriamente y sera mas complicado averiguar su nombre # el backref sirve para usarse en el modelo hijo (para que nos devuelva los datos del padre) # https://docs.sqlalchemy.org/en/14/orm/relationship_api.html#sqlalchemy.orm.relationship # lazy => define cuando SQLALchemy va a cargar la data de la base de datos # 'select' / True => es el valor por defecto, significa que SQLALchemy cargará los datos segun sea necesario # 'join'/ False => le dice a SQLALChemy que cargue la relacion en la misma consulta usan un JOIN # 'subquery' => trabaja como un JOIN pero en su lugar de hacerlo en una misma consulta lo hara en una subconsulta # 'dynamic' => es especial si se tiene muchos elementos y se desea aplicar filtros adicionales. SQLAlchemy devolvera otro objeto de consulta que se puede customizar antes de cargar los elementos de la bd. Al hacer esto tener en cuenta que el proceso de lectura de la bd puede ser mayor y x ende tener un mayor tiempo de espera libros = bd.relationship( 'LibroModel', backref='autorLibro', lazy=True ) # en el caso de fk se apunta al nombre de la tabla, mientras que en los relationship se apunta al nombre del modelo # en el caso de los relationship normal no puede estar creado la tabla aún def __init__(self, nombreAutor): self.autorNombre = nombreAutor # el metodo magico __str__ sirve para modificar la forma en que se imprimirá un objeto en consola def __str__(self): return '{}: {}'.format(self.autorId, self.autorNombre) def save(self): # el metodo session devuelve la sesion actual y evita que se cree una nueva sesion y asi relentizar la conexion a mi bd # el metodo add sirve para agregar toda mi instancia (mi nuevo autor) a un formato que sea valido para la bd bd.session.add(self) # el commit sirve para que los cambios realizados a la bd se hagan efecto, esto generalmente se usa con transacciones bd.session.commit() def json(self): return {'autor_id': self.autorId, 'autor_nombre': self.autorNombre} def delete(self): # con el delete se hace la eliminacion TEMPORAL DE LA BASE DE DATOS bd.session.delete(self) bd.session.commit()
class CategoriaModel(bd.Model): __tablename__ = "t_categoria" categoriaId = bd.Column(name="categoria_id", type_=bd.Integer, primary_key=True, autoincrement=True, nullable=False, unique=True) categoriaDescripcion = bd.Column( name="categoria_descripcion", type_=bd.String(45), unique=True, nullable=False) # esto no crea las relaciones simplemente sirve para al momento de hacer consultas con JOIN's libros = relationship('LibroModel', backref='categoriaLibro', lazy=True) def json(self): return { 'categoria_id': self.categoriaId, 'categoria_descripcion': self.categoriaDescripcion } def __init__(self, nombre): self.categoriaDescripcion = nombre def save(self): bd.session.add(self) bd.session.commit()
class LibroModel(bd.Model): __tablename__ = "t_libro" libroId = bd.Column(name="libro_id", type_=bd.Integer, primary_key=True, unique=True, autoincrement=True) libroNombre = bd.Column(name="libro_nombre", type_=bd.String(45)) libroCantidad = bd.Column(name="libro_cant", type_=bd.Integer) # YEAR solo funciona en dialecto MySQL libroEdicion = bd.Column(name="libro_edicion", type_=mysql.YEAR()) # Relaciones (fk) autor = bd.Column(bd.ForeignKey('t_autor.autor_id'), name="autor_id", type_=bd.Integer, nullable=False) categoria = bd.Column(bd.ForeignKey('t_categoria.categoria_id'), name="categoria_id", type_=bd.Integer, nullable=False) sedes = relationship('SedeLibroModel', backref='libroSede') def __init__(self, nombre, cantidad, edicion, autor, categoria): self.libroNombre = nombre self.libroCantidad = cantidad self.libroEdicion = edicion self.autor = autor self.categoria = categoria def save(self): bd.session.add(self) bd.session.commit() def json(self): return { 'libro_id': self.libroId, 'libro_nombre': self.libroNombre, 'libro_cantidad': self.libroCantidad, 'libro_edicion': self.libroEdicion, 'autor_id': self.autor, 'categoria_id': self.categoria }
class AutorModel(bd.Model): # para cambiar el nombre de la tabla a crearse __tablename__ = "t_autor" autorId = bd.Column(name="autor_id", type_=bd.Integer, primary_key=True, autoincrement=True, nullable=False, unique=True) autorNombre = bd.Column(name="autor_nombre", type_=bd.String(45)) libros = bd.relationship( 'LibroModel', backref="autorLibro" ) #En el caso # lazy => define cuando SQLALchemy va a cargar la data de la base de datos # 'select' / True => es el valor por defecto, significa que SQLALchemy cargará los datos segun sea necesario # 'join'/ False => le dice a SQLALChemy que cargue la relacion en la misma consulta usan un JOIN # 'subquery' => trabaja como un JOIN pero en su lugar de hacerlo en una misma consulta lo hara en una subconsulta # 'dynamic' => es especial si se tiene muchos elementos y se desea aplicar filtros adicionales. SQLAlchemy devolvera otro objeto de consulta que se puede customizar antes de cargar los elementos de la bd. Al hacer esto tener en cuenta que el proceso de lectura de la bd puede ser mayor y x ende tener un mayor tiempo de espera def __init__(self, nombreAutor): self.autorNombre = nombreAutor def __str__(self): return '{}: {}'.format(self.autorId, self.autorNombre) def save(self): #el metodo session devuelve la sesion actual y evita que se cree una nueva #session y asi relentizar la conexion a mi bd # el metodo add sirve para agregar toda mi instancia (mi nuevo autor) a un # formato que sea valido para la bd bd.session.add(self) # el commit sirve para que los cambios realizados a la bd se hagan efecto, esto # generalmente se usa con transacciones bd.session.commit() # def json(self): return {'autor_id': self.autorId, 'autor_nombre': self.autorNombre} def delete(self): # con el delete se hace la eliminacion TEMPORAL DE LA BASE DE DATOS bd.session.delete(self) bd.session.commit()
class SedeModel(bd.Model): __tablename__ = 't_sede' sedeId = bd.Column( name="sede_id", type_= bd.Integer, primary_key=True, autoincrement=True, nullable=False, unique=True ) sedeUbicacion = bd.Column( name="sede_ubicacion", type_= bd.String(45) ) sedeLatitud = bd.Column( name="sede_latitud", type_= bd.DECIMAL(9,7), nullable = False, ) sedeLongitud = bd.Column( name="sede_longitud", type_ = bd.DECIMAL(9,7), nullable = False ) libro = relationship('SedeLibroModel', backref='sedeLibro') def __init__(self, ubicacion, latitud, longitud): self.sedeUbicacion = ubicacion self.sedeLatitud = latitud self.sedeLongitud = longitud def save(self): bd.session.add(self) bd.session.commit() def json(self): return{ 'sede_id': self.sedeId, 'sede_ubicacion': self.sedeUbicacion, 'sede_latitud': str(self.sedeLatitud), 'sede_longitud': str(self.sedeLongitud) }
class SedeModel(bd.Model): __tablename__ = "t_sede" sedeId = bd.Column( name="sede_id", type_=bd.Integer, # tipo de dato en la bd primary_key=True, # setear si es PK(True) o no (False) autoincrement=True, # setear si va a autoincrementarse nullable=False, # seter si va a admitir valores nulos o no unique=True # si no se va a repetir el valor ) sedeUbicacion = bd.Column(name="sede_ubicacion", type_=bd.String(45)) sedeLatitud = bd.Column(name="sede_latitud", type_=bd.DECIMAL(9, 7), nullable=False) sedeLongitud = bd.Column(name="sede_longitud", type_=bd.DECIMAL(9, 7), nullable=False) libros = relationship('SedeLibroModel', backref='sedeLibro') def __init__(self, ubicacion, sedeLatitud, sedeLongitud): self.sedeUbicacion = ubicacion self.sedeLatitud = sedeLatitud self.sedeLongitud = sedeLongitud def save(self): bd.session.add(self) bd.session.commit() def json(self): return { 'sede_id': self.sedeId, 'sede_ubicacion': self.sedeUbicacion, 'sede_latitud': str(self.sedeLatitud), 'sede_longitud': str(self.sedeLongitud) }