Функция declarative_base
Функция declarative_base создает базовый
класс, от которого наследуются все декларативные
модели. Декларативный стиль позволяет описывать
таблицы базы данных в виде Python-классов, а
связь между классом и таблицей SQLAlchemy
устанавливает автоматически. Первым параметром
можно передать метаданные metadata, а
именованными параметрами - настройки маппера,
например cls и constructor.
Синтаксис
declarative_base(metadata=None, cls=object, name='Base', class_registry=None, constructor=<class 'object'>, metaclass=DeclarativeMeta)
Пример
Давайте создадим базовый класс и опишем модель
таблицы articles:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
status = Column(String)
num = Column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Article.__tablename__)
print(Base.metadata.tables.keys())
Результат выполнения кода:
"articles"
"dict_keys(['articles'])"
Пример
Давайте создадим объект модели и сохраним его в базу данных:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
status = Column(String)
num = Column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
session.commit()
res = session.query(Article).all()
print([a.title for a in res])
Результат выполнения кода:
['article']
Пример
Давайте передадим свои метаданные в функцию
declarative_base:
from sqlalchemy import MetaData, create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base
metadata = MetaData()
Base = declarative_base(metadata=metadata)
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
status = Column(String)
num = Column(Integer)
engine = create_engine('sqlite:///:memory:')
metadata.create_all(engine)
print(list(metadata.tables))
Результат выполнения кода:
['articles']
Смотрите также
-
класс
DeclarativeBase,
который представляет современную альтернативу базовому классу -
класс
declarative_mixin,
который создает миксин для декларативных моделей -
функцию
as_declarative,
которая превращает класс в декларативную базу -
атрибут
__tablename__,
который задает имя таблицы для модели