Já foi dito muito que SQLAlchemy é uma das bibliotecas mais populares para a criação de esquemas de banco de dados. Hoje veremos um exemplo simples de criação de um pequeno esquema de dados para um aplicativo de pesquisa de cotações. Usaremos PostgreSQL como um DBMS.
Usaremos uma abordagem declarativa para definir modelos, uma vez que, em minha opinião, é mais simples e clara do que a abordagem clássica baseada no mapeador. Vamos primeiro esboçar o 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__
, .
Depois de criar o esquema de dados, você pode expandir as tabelas de diferentes maneiras. Para verificar se não há inconsistências, você pode usar as seguintes linhas, tendo criado o banco de dados anteriormente (o exemplo é para postgresql).
engine = create_engine('postgresql://user:password@host:port/db_name')
Base.metadata.create_all(engine)
Mas é muito mais conveniente usar ferramentas para gerenciar migrações, por exemplo, alambique. Na verdade, ele permite que você mova o banco de dados de um estado consistente para outro.