Cree un esquema de base de datos usando SQLAlchemy

Se ha dicho mucho que SQLAlchemy es una de las bibliotecas más populares para crear esquemas de bases de datos. Hoy veremos un ejemplo simple de creación de un esquema de datos pequeños para una aplicación de búsqueda de cotizaciones. Usaremos PostgreSQL como DBMS.





Usaremos un enfoque declarativo para definir modelos, ya que, en mi opinión, es más simple y claro que el enfoque clásico basado en mapeador. Primero dibujemos el diagrama er.





, , , .





SQLAlchemy . Quote relationship.





from sqlalchemy import Column, ForeignKey, Integer, String, Text, Date, DateTime
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Topic(Base):

    __tablename__ = 'topic'
    __tableargs__ = {
        'comment': ' '
    }

    topic_id = Column(
        Integer,
        nullable=False,
        unique=True,
        primary_key=True,
        autoincrement=True
    )
    name = Column(String(128), comment=' ')
    description = Column(Text, comment=' ')

    def __repr__(self):
        return f'{self.topic_id} {self.name} {self.description}'


class Author(Base):

    __tablename__ = 'author'
    __tableargs__ = {
        'comment': ' '
    }

    author_id = Column(
        Integer,
        nullable=False,
        unique=True,
        primary_key=True,
        autoincrement=True
    )
    name = Column(String(128), comment=' ')
    birth_date = Column(Date, comment='  ')
    country = Column(String(128), comment='  ')

    def __repr__(self):
        return f'{self.author_id} {self.name} {self.birth_date} {self.country}'


class Quote(Base):

    __tablename__ = 'quote'
    __tableargs__ = {
        'comment': ''
    }

    quote_id = Column(
        Integer,
        nullable=False,
        unique=True,
        primary_key=True,
        autoincrement=True
    )
    text = Column(Text, comment=' ')
    created_at = Column(DateTime, comment='    ')
    author_id = Column(Integer,  ForeignKey('author.author_id'), comment=' ')
    topic_id = Column(Integer, ForeignKey('topic.topic_id'), comment=' ')
    author = relationship('Author', backref='quote_author', lazy='subquery')
    topic = relationship('Topic', backref='quote_topic', lazy='subquery')

    def __repr__(self):
        return f'{self.text} {self.created_at} {self.author_id} {self.topic_id}'
      
      







, , . , Base



. , __tablename__



__tableargs__



.





, . , . relationship



. , , . lazy



, . joined



subquery



: , -, , - .





__repr__



, .





Después de crear el esquema de datos, puede expandir las tablas de diferentes formas. Para comprobar que no existen inconsistencias, puede utilizar las siguientes líneas, habiendo creado previamente la base de datos (el ejemplo es para postgresql).





engine = create_engine('postgresql://user:password@host:port/db_name')
Base.metadata.create_all(engine)
      
      



Pero es mucho más conveniente utilizar herramientas para gestionar las migraciones, por ejemplo, alambic. De hecho, le permite mover la base de datos de un estado consistente a otro.








All Articles