Атрибут persist_selectable
Атрибут persist_selectable класса Mapper хранит объект
Selectable, который маппер использует для выполнения
операций записи в базу данных: INSERT, UPDATE и DELETE.
По умолчанию этим объектом является таблица, указанная в атрибуте
__tablename__ или переданная явно в параметре local_table.
Атрибут доступен только для чтения и устанавливается автоматически
при конфигурации маппера.
В большинстве случаев persist_selectable совпадает с атрибутом
local_table. Однако при использовании наследования или
маппинга на подзапросы (например, через select или
join) значение persist_selectable может отличаться:
оно указывает именно на тот объект, в который SQLAlchemy будет
направлять операции записи.
Синтаксис
Mapper.persist_selectable
Пример
Давайте создадим модель и получим значение атрибута
persist_selectable через объект маппера:
from sqlalchemy import Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
mapper = Article.__mapper__
print(mapper.persist_selectable)
Результат выполнения кода:
"articles"
Пример
Давайте сравним persist_selectable с атрибутом
local_table для той же модели:
from sqlalchemy import Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
mapper = Article.__mapper__
print(mapper.persist_selectable is mapper.local_table)
print(mapper.persist_selectable.name)
Результат выполнения кода:
True
"articles"
Пример
Давайте получим список колонок через persist_selectable
и выведем их имена:
from sqlalchemy import Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
mapper = Article.__mapper__
for column in mapper.persist_selectable.columns:
print(column.name)
Результат выполнения кода:
"id"
"title"
"text"
"status"
"num"
Пример
Давайте выполним вставку строки и убедимся, что SQLAlchemy
использует persist_selectable как целевую таблицу:
from sqlalchemy import Integer, String, create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_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()
print(Article.__mapper__.persist_selectable.name)
print(session.query(Article).count())
Результат выполнения кода:
"articles"
1
Смотрите также
-
класс
Mapper,
который представляет маппер ORM-класса -
атрибут
local_table,
который хранит локальную таблицу маппера -
атрибут
columns,
который содержит коллекцию колонок маппера -
атрибут
primary_key,
который хранит первичный ключ маппера