Telah banyak dikatakan bahwa SQLAlchemy adalah salah satu perpustakaan paling populer untuk membuat skema database. Hari ini kita akan melihat contoh sederhana membuat skema data kecil untuk aplikasi pencarian kutipan. Kami akan menggunakan PostgreSQL sebagai DBMS.
Kami akan menggunakan pendekatan deklaratif untuk mendefinisikan model, karena, menurut saya, ini lebih sederhana dan lebih jelas daripada pendekatan klasik berdasarkan mapper. Mari kita buat sketsa diagram er terlebih dahulu.
, , , .
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__
, .
Setelah membuat skema data, Anda dapat memperluas tabel dengan berbagai cara. Untuk memeriksa bahwa tidak ada inkonsistensi, Anda dapat menggunakan baris berikut, setelah sebelumnya membuat database (contoh untuk postgresql).
engine = create_engine('postgresql://user:password@host:port/db_name')
Base.metadata.create_all(engine)
Tetapi jauh lebih nyaman menggunakan alat untuk mengelola migrasi, misalnya, alembic. Bahkan, ini memungkinkan Anda untuk memindahkan database dari satu status konsisten ke status lain.