Отражение объектов базы данных

Объекту Table можно поручить загрузить информацию о себе из соответствующего объекта схемы базы данных, уже существующего в базе данных. Этот процесс называется отражение. В самом простом случае вам нужно указать только имя таблицы, объект MetaData и аргумент autoload_with:

>>> messages = Table("messages", metadata_obj, autoload_with=engine)
>>> [c.name for c in messages.columns]
['message_id', 'message_name', 'date']

Приведенная выше операция будет использовать данный движок для запроса базы данных информации о таблице messages, а затем сгенерирует Column, ForeignKey и другие объекты, соответствующие этой информации, как если бы объект Table был создан вручную на Python.

При отражении таблиц, если данная таблица ссылается на другую таблицу через внешний ключ, создается второй объект Table внутри объекта MetaData, представляющего соединение. Ниже, предположим, что таблица shopping_cart_items ссылается на таблицу с именем shopping_carts. Отражение таблицы shopping_cart_items имеет такой эффект, что таблица shopping_carts также будет загружена:

>>> shopping_cart_items = Table("shopping_cart_items", metadata_obj, autoload_with=engine)
>>> "shopping_carts" in metadata_obj.tables
True

MetaData имеет интересное «синглтоноподобное» поведение: если вы запросили обе таблицы по отдельности, MetaData обеспечит создание ровно одного объекта Table для каждого отдельного имени таблицы. Конструктор Table фактически возвращает вам уже существующий объект Table, если он уже существует с заданным именем. Как показано ниже, мы можем получить доступ к уже созданной таблице shopping_carts, просто назвав ее:

shopping_carts = Table("shopping_carts", metadata_obj)

Конечно, хорошей идеей является использование autoload_with=engine с вышеупомянутой таблицей независимо от нее. Это делается для того, чтобы атрибуты таблицы были загружены, если они еще не были загружены. Операция автозагрузки происходит только для таблицы, если она еще не была загружена; после загрузки новые вызовы Table с тем же именем не будут перевыпускать никаких запросов на отражение.

Переопределение отраженных столбцов

При отражении таблиц отдельные столбцы могут быть переопределены явными значениями; это удобно для указания пользовательских типов данных, ограничений, таких как первичные ключи, которые не могут быть настроены в базе данных, и т.д.:

>>> mytable = Table(
...     "mytable",
...     metadata_obj,
...     Column(
...         "id", Integer, primary_key=True
...     ),  # override reflected 'id' to have primary key
...     Column("mydata", Unicode(50)),  # override reflected 'mydata' to be Unicode
...     # additional Column objects which require no change are reflected normally
...     autoload_with=some_engine,
... )

См.также

Работа с пользовательскими типами и отражение - иллюстрирует, как вышеописанная техника переопределения столбцов применяется к использованию пользовательских типов данных с отражением в таблице.

Отражающие взгляды

Система отражения может также отражать представления. Базовое использование такое же, как и для таблицы:

my_view = Table("some_view", metadata, autoload_with=engine)

Выше, my_view представляет собой объект Table с объектами Column, представляющими имена и типы каждого столбца в представлении «some_view».

Обычно при отражении представления желательно иметь как минимум ограничение первичного ключа, а то и внешних ключей. Отражение представления не экстраполирует эти ограничения.

Используйте для этого технику «переопределения», явно указывая те столбцы, которые являются частью первичного ключа или имеют ограничения внешнего ключа:

my_view = Table(
    "some_view",
    metadata,
    Column("view_id", Integer, primary_key=True),
    Column("related_thing", Integer, ForeignKey("othertable.thing_id")),
    autoload_with=engine,
)

Отражение всех столов одновременно

Объект MetaData также может получить листинг таблиц и отразить полный набор. Это достигается с помощью метода reflect(). После его вызова все расположенные таблицы присутствуют в словаре таблиц объекта MetaData:

metadata_obj = MetaData()
metadata_obj.reflect(bind=someengine)
users_table = metadata_obj.tables["users"]
addresses_table = metadata_obj.tables["addresses"]

metadata.reflect() также предоставляет удобный способ очистки или удаления всех строк в базе данных:

metadata_obj = MetaData()
metadata_obj.reflect(bind=someengine)
for table in reversed(metadata_obj.sorted_tables):
    someengine.execute(table.delete())

Отражение таблиц из других схем

Раздел Указание имени схемы вводит понятие схем таблиц, которые представляют собой пространства имен в базе данных, содержащие таблицы и другие объекты, и которые могут быть заданы в явном виде. Схема» для объекта Table, а также для других объектов, таких как представления, индексы и последовательности, может быть задана с помощью параметра Table.schema, а также в качестве схемы по умолчанию для объекта MetaData с помощью параметра MetaData.schema.

Использование этого параметра схемы напрямую влияет на то, куда будет смотреть функция отражения таблиц, когда ее попросят отразить объекты. Например, если объект MetaData сконфигурирован с именем схемы по умолчанию «project» через параметр MetaData.schema:

>>> metadata_obj = MetaData(schema="project")

Затем MetaData.reflect() будет использовать эту настроенную .schema для отражения:

>>> # uses `schema` configured in metadata_obj
>>> metadata_obj.reflect(someengine)

Конечным результатом будет то, что объекты Table из схемы «project» будут отражены, и они будут заполнены как schema-qualified с этим именем:

>>> metadata_obj.tables["project.messages"]
Table('messages', MetaData(), Column('message_id', INTEGER(), table=<messages>), schema='project')

Аналогично, отдельный объект Table, включающий параметр Table.schema, также будет отражен от схемы этой базы данных, переопределяя любую схему по умолчанию, которая могла быть настроена для принадлежащей коллекции MetaData:

>>> messages = Table("messages", metadata_obj, schema="project", autoload_with=someengine)
>>> messages
Table('messages', MetaData(), Column('message_id', INTEGER(), table=<messages>), schema='project')

Наконец, сам метод MetaData.reflect() также позволяет передать параметр MetaData.reflect.schema, поэтому мы могли бы также загрузить таблицы из схемы «проекта» для сконфигурированного по умолчанию объекта MetaData:

>>> metadata_obj = MetaData()
>>> metadata_obj.reflect(someengine, schema="project")

Мы можем вызывать MetaData.reflect() любое количество раз с разными аргументами MetaData.schema (или вообще без них), чтобы продолжить заполнение объекта MetaData новыми объектами:

>>> # add tables from the "customer" schema
>>> metadata_obj.reflect(someengine, schema="customer")
>>> # add tables from the default schema
>>> metadata_obj.reflect(someengine)

Взаимодействие Schema-qualified Reflection со схемой по умолчанию

Обобщение лучших практик раздела

В этом разделе мы обсудим поведение SQLAlchemy при отражении таблиц, которые видны в «схеме по умолчанию» сессии базы данных, и как они взаимодействуют с директивами SQLAlchemy, которые включают схему в явном виде. В качестве лучшей практики убедитесь, что схема «по умолчанию» для базы данных - это просто одно имя, а не список имен; для таблиц, которые являются частью этой схемы «по умолчанию» и могут быть названы без указания схемы в DDL и SQL, оставьте соответствующие Table.schema и подобные параметры схемы установленными по умолчанию None.

Как описано в Указание имени схемы по умолчанию с помощью метаданных, базы данных, имеющие концепцию схем, обычно также включают концепцию схемы «по умолчанию». Причина этого, естественно, заключается в том, что если ссылаться на табличные объекты без схемы, как это часто бывает, база данных, поддерживающая схему, все равно будет считать, что эта таблица находится где-то в «схеме». Некоторые базы данных, такие как PostgreSQL, развивают эту концепцию до понятия schema search path, где множество имен схем могут рассматриваться в конкретной сессии базы данных как «неявные»; обращение к имени таблицы, что это любая из этих схем, не требует присутствия имени схемы (и в то же время совершенно нормально, если имя схемы присутствует).

Поскольку в большинстве реляционных баз данных существует концепция конкретного объекта таблицы, на который можно ссылаться как в соответствии со схемой, так и «неявно», когда схема отсутствует, это создает сложности для функции отражения SQLAlchemy. Отражение таблицы в соответствии со схемой всегда будет заполнять ее атрибут Table.schema и дополнительно влиять на то, как эта Table организована в коллекцию MetaData.tables, то есть в соответствии со схемой. И наоборот, отражение одной и той же таблицы способом, не отвечающим требованиям схемы, организует ее в коллекцию MetaData.tables **без учета требований схемы. В итоге в одной коллекции MetaData будут два отдельных объекта Table, представляющих одну и ту же таблицу в реальной базе данных.

Чтобы проиллюстрировать последствия этого вопроса, рассмотрим таблицы из схемы «проект» в предыдущем примере, а также предположим, что схема «проект» является схемой по умолчанию нашего подключения к базе данных, или, если используется такая база данных, как PostgreSQL, предположим, что схема «проект» установлена в PostgreSQL search_path. Это означает, что база данных воспринимает следующие два оператора SQL как эквивалентные:

-- schema qualified
SELECT message_id FROM project.messages

-- non-schema qualified
SELECT message_id FROM messages

Это не проблема, поскольку таблицу можно найти обоими способами. Однако в SQLAlchemy именно идентичность объекта Table определяет его семантическую роль в SQL-запросе. Исходя из текущих решений в SQLAlchemy, это означает, что если мы отразим одну и ту же таблицу «messages» как в соответствии со схемой, так и без нее, мы получим два объекта Table, которые не будут рассматриваться как семантически эквивалентные:

>>> # reflect in non-schema qualified fashion
>>> messages_table_1 = Table("messages", metadata_obj, autoload_with=someengine)
>>> # reflect in schema qualified fashion
>>> messages_table_2 = Table(
...     "messages", metadata_obj, schema="project", autoload_with=someengine
... )
>>> # two different objects
>>> messages_table_1 is messages_table_2
False
>>> # stored in two different ways
>>> metadata.tables["messages"] is messages_table_1
True
>>> metadata.tables["project.messages"] is messages_table_2
True

Вышеописанная проблема усложняется, когда отражаемые таблицы содержат ссылки внешних ключей на другие таблицы. Предположим, что в таблице «messages» есть столбец «project_id», который ссылается на строки в другой локальной таблице «projects», то есть существует объект ForeignKeyConstraint, который является частью определения таблицы «messages».

Мы можем оказаться в ситуации, когда одна коллекция MetaData может содержать до четырех объектов Table, представляющих две таблицы базы данных, где одна или две из дополнительных таблиц были созданы процессом отражения; это происходит потому, что когда процесс отражения встречает ограничение внешнего ключа на отражаемой таблице, он разветвляется, чтобы отразить и ту таблицу, на которую ссылается. Принятие решения, которое он использует для назначения схемы этой ссылающейся таблице, заключается в том, что SQLAlchemy омитирует схему по умолчанию из отраженного объекта ForeignKeyConstraint, если в собственном Table также опущено имя схемы, а также в том, что эти два объекта находятся в одной схеме, но включит ее, если она не была опущена.

Распространенным сценарием является ситуация, когда отражение таблицы в соответствии со схемой загружает связанную таблицу, которая также будет выполнена в соответствии со схемой:

>>> # reflect "messages" in a schema qualified fashion
>>> messages_table_1 = Table(
...     "messages", metadata_obj, schema="project", autoload_with=someengine
... )

Приведенная выше messages_table_1 будет ссылаться на projects также с учетом схемы. Эта таблица «projects» будет отражена автоматически тем, что «messages» ссылается на нее:

>>> messages_table_1.c.project_id
Column('project_id', INTEGER(), ForeignKey('project.projects.project_id'), table=<messages>)

если какая-то другая часть кода отражает «проекты» не в соответствии со схемой, то теперь есть две таблицы проектов, которые не являются одним и тем же:

>>> # reflect "projects" in a non-schema qualified fashion
>>> projects_table_1 = Table("projects", metadata_obj, autoload_with=someengine)
>>> # messages does not refer to projects_table_1 above
>>> messages_table_1.c.project_id.references(projects_table_1.c.project_id)
False
>>> # it refers to this one
>>> projects_table_2 = metadata_obj.tables["project.projects"]
>>> messages_table_1.c.project_id.references(projects_table_2.c.project_id)
True
>>> # they're different, as one non-schema qualified and the other one is
>>> projects_table_1 is projects_table_2
False

Вышеописанная путаница может вызвать проблемы в приложениях, использующих отражение таблиц для загрузки объектов Table на уровне приложения, а также в сценариях миграции, в частности, при использовании Alembic Migrations для обнаружения новых таблиц и ограничений внешних ключей.

Вышеописанное поведение можно исправить, если придерживаться одной простой практики:

  • Не включайте параметр Table.schema для любого Table, который ожидает расположения в схеме базы данных default.

Для PostgreSQL и других баз данных, которые поддерживают путь «поиска» для схем, добавьте следующую дополнительную практику:

  • Сужайте «путь поиска» только до одной схемы, которая является схемой по умолчанию.

См.также

Интроспекция таблиц удаленных схем и поиск_пути в PostgreSQL - дополнительные подробности этого поведения применительно к базе данных PostgreSQL.

Мелкозернистое отражение с инспектором

Также доступен низкоуровневый интерфейс, обеспечивающий независимую от бэкенда систему загрузки списков описаний схем, таблиц, столбцов и ограничений из данной базы данных. Он известен как «Инспектор»:

from sqlalchemy import create_engine
from sqlalchemy import inspect

engine = create_engine("...")
insp = inspect(engine)
print(insp.get_table_names())
Object Name Description

Inspector

Выполняет проверку схемы базы данных.

ReflectedCheckConstraint

Словарь, представляющий отраженные элементы, соответствующие CheckConstraint.

ReflectedColumn

Словарь, представляющий отраженные элементы, соответствующие объекту Column.

ReflectedComputed

Представляют отраженные элементы вычисляемого столбца, соответствующие конструкции Computed.

ReflectedForeignKeyConstraint

Словарь, представляющий отраженные элементы, соответствующие ForeignKeyConstraint.

ReflectedIdentity

представляют отраженную структуру IDENTITY столбца, соответствующую конструкции Identity.

ReflectedIndex

Словарь, представляющий отраженные элементы, соответствующие Index.

ReflectedPrimaryKeyConstraint

Словарь, представляющий отраженные элементы, соответствующие PrimaryKeyConstraint.

ReflectedTableComment

Словарь, представляющий отраженный комментарий, соответствующий атрибуту Table.comment.

ReflectedUniqueConstraint

Словарь, представляющий отраженные элементы, соответствующие UniqueConstraint.

class sqlalchemy.engine.reflection.Inspector

Выполняет проверку схемы базы данных.

Инспектор действует как прокси для методов отражения Dialect, обеспечивая согласованный интерфейс, а также поддержку кэширования для ранее полученных метаданных.

Объект Inspector обычно создается с помощью функции inspect(), которой может быть передан Engine или Connection:

from sqlalchemy import inspect, create_engine
engine = create_engine('...')
insp = inspect(engine)

Там, где это указано выше, Dialect, связанный с движком, может выбрать для возврата Inspector подкласс, который предоставляет дополнительные методы, специфичные для целевой базы данных диалекта.

Классная подпись

класс sqlalchemy.engine.reflection.Inspector (sqlalchemy.inspection.Inspectable)

method sqlalchemy.engine.reflection.Inspector.__init__(bind: Union[Engine, Connection])

Инициализируйте новый Inspector.

Не рекомендуется, начиная с версии 1.4: Метод __init__() на Inspector устарел и будет удален в будущем выпуске. Пожалуйста, используйте функцию inspect() на Engine или Connection для получения Inspector.

Параметры:

bindConnection, который обычно является экземпляром Engine или Connection.

Для конкретного для данного диалекта случая Inspector см. Inspector.from_engine()

attribute sqlalchemy.engine.reflection.Inspector.bind: Union[Engine, Connection]
method sqlalchemy.engine.reflection.Inspector.clear_cache() None

сбросить кэш для этого Inspector.

Методы проверки, которые имеют кэшированные данные, будут выдавать SQL-запросы при следующем вызове для получения новых данных.

Добавлено в версии 2.0.

attribute sqlalchemy.engine.reflection.Inspector.default_schema_name

Возвращает имя схемы по умолчанию, представленное диалектом для пользователя базы данных текущего движка.

Например, обычно это public для PostgreSQL и dbo для SQL Server.

attribute sqlalchemy.engine.reflection.Inspector.dialect: Dialect
attribute sqlalchemy.engine.reflection.Inspector.engine: Engine
classmethod sqlalchemy.engine.reflection.Inspector.from_engine(bind: Engine) Inspector

Создайте новый объект Inspector, специфичный для диалекта, на основе заданного двигателя или соединения.

Не рекомендуется, начиная с версии 1.4: Метод from_engine() на Inspector устарел и будет удален в будущем выпуске. Пожалуйста, используйте функцию inspect() на Engine или Connection для получения Inspector.

Параметры:

bindConnection или Engine.

Этот метод отличается от прямого вызова конструктора Inspector тем, что Dialect предоставляется возможность предоставить специфичный для диалекта экземпляр Inspector, который может предоставлять дополнительные методы.

См. пример в Inspector.

method sqlalchemy.engine.reflection.Inspector.get_check_constraints(table_name: str, schema: Optional[str] = None, **kw: Any) List[ReflectedCheckConstraint]

Возвращает информацию о контрольных ограничениях в table_name.

Учитывая строку table_name и необязательную строку schema, возвращает информацию об ограничениях проверки в виде списка ReflectedCheckConstraint.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

список словарей, каждый из которых представляет собой определение ограничений проверки.

method sqlalchemy.engine.reflection.Inspector.get_columns(table_name: str, schema: Optional[str] = None, **kw: Any) List[ReflectedColumn]

Возвращает информацию о столбцах в table_name.

Учитывая строку table_name и необязательную строку schema, вернуть информацию о столбце в виде списка ReflectedColumn.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

список словарей, каждый из которых представляет собой определение столбца базы данных.

method sqlalchemy.engine.reflection.Inspector.get_foreign_keys(table_name: str, schema: Optional[str] = None, **kw: Any) List[ReflectedForeignKeyConstraint]

Возвращает информацию об foreign_keys в table_name.

Учитывая строку table_name и необязательную строку schema, возвращает информацию о внешнем ключе в виде списка ReflectedForeignKeyConstraint.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

список словарей, каждый из которых представляет определение внешнего ключа.

method sqlalchemy.engine.reflection.Inspector.get_indexes(table_name: str, schema: Optional[str] = None, **kw: Any) List[ReflectedIndex]

Возвращает информацию об индексах в table_name.

Учитывая строку table_name и необязательную строку schema, возвращает информацию об индексе в виде списка ReflectedIndex.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

список словарей, каждый из которых представляет собой определение индекса.

method sqlalchemy.engine.reflection.Inspector.get_materialized_view_names(schema: Optional[str] = None, **kw: Any) List[str]

Возвращает все имена материализованных представлений в schema.

Параметры:
  • schema – Необязательно, извлекает имена из схемы не по умолчанию. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Добавлено в версии 2.0.

См.также

Inspector.get_view_names()

method sqlalchemy.engine.reflection.Inspector.get_multi_check_constraints(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, List[ReflectedCheckConstraint]]

Возвращает информацию о контрольных ограничениях во всех таблицах данной схемы.

Таблицы можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является список ReflectedCheckConstraint.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, следует ли отражать ограничения таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - список словарей, каждый из которых представляет собой определение ограничений проверки. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.get_multi_columns(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, List[ReflectedColumn]]

Возвращает информацию о столбцах во всех объектах в данной схеме.

Объекты можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является список ReflectedColumn.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, должны ли отражаться столбцы таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - список словарей, каждый из которых представляет собой определение столбца базы данных. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

См.также

Inspector.get_columns()

method sqlalchemy.engine.reflection.Inspector.get_multi_foreign_keys(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, List[ReflectedForeignKeyConstraint]]

Возвращает информацию об foreign_keys во всех таблицах в данной схеме.

Таблицы можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является список ReflectedForeignKeyConstraint.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, должны ли отражаться внешние ключи таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - список словарей, каждый из которых представляет собой определение внешнего ключа. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.get_multi_indexes(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, List[ReflectedIndex]]

Возвращает информацию об индексах во всех объектах в данной схеме.

Объекты можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является список ReflectedIndex.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, следует ли отражать индексы таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - список словарей, каждый из которых представляет собой определение индекса. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

См.также

Inspector.get_indexes()

method sqlalchemy.engine.reflection.Inspector.get_multi_pk_constraint(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, ReflectedPrimaryKeyConstraint]

Возвращает информацию об ограничениях первичного ключа во всех таблицах данной схемы.

Таблицы можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является ReflectedPrimaryKeyConstraint.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, следует ли отражать первичные ключи таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - словари, каждый из которых представляет собой определение ограничения первичного ключа. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.get_multi_table_comment(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, ReflectedTableComment]

Возвращает информацию о комментарии таблицы во всех объектах в данной схеме.

Объекты можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является ReflectedTableComment.

Вызывает NotImplementedError для диалекта, который не поддерживает комментарии.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, следует ли отражать комментарии таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, ключами которого являются кортеж schema,table-name, а значениями - словари, представляющие комментарии к таблице. Если схема не предоставлена, она имеет значение None.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.get_multi_table_options(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, Dict[str, Any]]

Возвращает словарь опций, заданных при создании таблиц в данной схеме.

Таблицы можно фильтровать, передавая имена для использования в filter_names.

В настоящее время это включает некоторые опции, которые применяются к таблицам MySQL и Oracle.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, следует ли отражать опции таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - словари с параметрами таблицы. Возвращаемые ключи в каждом dict зависят от используемого диалекта. Каждый из них имеет префикс с именем диалекта. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.get_multi_unique_constraints(schema: Optional[str] = None, filter_names: Optional[Sequence[str]] = None, kind: ObjectKind = ObjectKind.TABLE, scope: ObjectScope = ObjectScope.DEFAULT, **kw: Any) Dict[TableKey, List[ReflectedUniqueConstraint]]

Возвращает информацию об уникальных ограничениях во всех таблицах данной схемы.

Таблицы можно фильтровать, передавая имена для использования в filter_names.

Для каждой таблицы значением является список ReflectedUniqueConstraint.

Параметры:
  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • filter_names – опционально возвращают информацию только для перечисленных здесь объектов.

  • kind – a ObjectKind, указывающий тип объектов для отражения. По умолчанию имеет значение ObjectKind.TABLE.

  • scope – a ObjectScope, указывающий, следует ли отражать ограничения таблиц по умолчанию, временных или любых таблиц. По умолчанию имеет значение ObjectScope.DEFAULT.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, где ключами являются два кортежа schema,table-name, а значениями - список словарей, каждый из которых представляет собой определение уникального ограничения. Схема имеет значение None, если схема не предоставлена.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.get_pk_constraint(table_name: str, schema: Optional[str] = None, **kw: Any) ReflectedPrimaryKeyConstraint

Возвращает информацию об ограничении первичного ключа в table_name.

Учитывая строку table_name и необязательную строку schema, возвращает информацию о первичном ключе в виде ReflectedPrimaryKeyConstraint.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, представляющий определение ограничения первичного ключа.

method sqlalchemy.engine.reflection.Inspector.get_schema_names(**kw: Any) List[str]

Возвращает все имена схем.

Параметры:

**kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

method sqlalchemy.engine.reflection.Inspector.get_sequence_names(schema: Optional[str] = None, **kw: Any) List[str]

Возвращает все имена последовательностей в schema.

Параметры:
  • schema – Необязательно, извлекает имена из схемы не по умолчанию. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

method sqlalchemy.engine.reflection.Inspector.get_sorted_table_and_fkc_names(schema: Optional[str] = None, **kw: Any) List[Tuple[Optional[str], List[Tuple[str, Optional[str]]]]]

Возвращает отсортированные по зависимостям имена таблиц и ограничений внешних ключей, на которые ссылается конкретная схема.

Это даст 2 кортежа (tablename, [(tname, fkname), (tname, fkname), ...]), состоящих из имен таблиц в порядке CREATE, сгруппированных с именами ограничений внешнего ключа, которые не были обнаружены как принадлежащие циклу. Последним элементом будет (None, [(tname, fkname), (tname, fkname), ..]), который будет состоять из оставшихся имен ограничений внешнего ключа, для которых потребуется отдельный шаг CREATE постфактум, основанный на зависимостях между таблицами.

Параметры:
  • schema – имя схемы для запроса, если не используется схема по умолчанию.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

См.также

Inspector.get_table_names()

sort_tables_and_constraints() - аналогичный метод, который работает с уже заданным MetaData.

method sqlalchemy.engine.reflection.Inspector.get_table_comment(table_name: str, schema: Optional[str] = None, **kw: Any) ReflectedTableComment

Возвращает информацию о комментарии к таблице для table_name.

Учитывая строку table_name и необязательную строку schema, вернуть информацию о комментариях к таблице в виде ReflectedTableComment.

Вызывает NotImplementedError для диалекта, который не поддерживает комментарии.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

словарь, с комментарием к таблице.

Добавлено в версии 1.2.

method sqlalchemy.engine.reflection.Inspector.get_table_names(schema: Optional[str] = None, **kw: Any) List[str]

Возвращает все имена таблиц в определенной схеме.

Ожидается, что имена будут только реальными таблицами, а не представлениями. Вместо этого представления возвращаются с помощью методов Inspector.get_view_names() и/или Inspector.get_materialized_view_names().

Параметры:
  • schema – Имя схемы. Если schema оставить None, то используется схема базы данных по умолчанию, в противном случае выполняется поиск именованной схемы. Если база данных не поддерживает именованные схемы, поведение не определено, если schema не передано как None. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

method sqlalchemy.engine.reflection.Inspector.get_table_options(table_name: str, schema: Optional[str] = None, **kw: Any) Dict[str, Any]

Возвращает словарь опций, указанных при создании таблицы с заданным именем.

В настоящее время это включает некоторые опции, которые применяются к таблицам MySQL и Oracle.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

dict с параметрами таблицы. Возвращаемые ключи зависят от используемого диалекта. Каждый из них имеет префикс с именем диалекта.

method sqlalchemy.engine.reflection.Inspector.get_temp_table_names(**kw: Any) List[str]

Возвращает список имен временных таблиц для текущей привязки.

Этот метод не поддерживается большинством диалектов; в настоящее время он реализован только в Oracle, PostgreSQL и SQLite.

Параметры:

**kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

method sqlalchemy.engine.reflection.Inspector.get_temp_view_names(**kw: Any) List[str]

Возвращает список временных имен представлений для текущей привязки.

Этот метод не поддерживается большинством диалектов; в настоящее время он реализован только в PostgreSQL и SQLite.

Параметры:

**kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

method sqlalchemy.engine.reflection.Inspector.get_unique_constraints(table_name: str, schema: Optional[str] = None, **kw: Any) List[ReflectedUniqueConstraint]

Возвращает информацию об уникальных ограничениях в table_name.

Учитывая строку table_name и необязательную строку schema, возвращает уникальную информацию об ограничениях в виде списка ReflectedUniqueConstraint.

Параметры:
  • table_name – строковое имя таблицы. Для специального цитирования используйте quoted_name.

  • schema – string имя схемы; если опущено, используется схема по умолчанию соединения с базой данных. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Результат:

список словарей, каждый из которых представляет собой определение уникального ограничения.

method sqlalchemy.engine.reflection.Inspector.get_view_definition(view_name: str, schema: Optional[str] = None, **kw: Any) str

Возвращает определение для обычного или материализованного представления с именем view_name.

Параметры:
  • view_name – Название вида.

  • schema – Необязательно, извлекает имена из схемы не по умолчанию. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

method sqlalchemy.engine.reflection.Inspector.get_view_names(schema: Optional[str] = None, **kw: Any) List[str]

Возвращает все нематериализованные имена представлений в schema.

Параметры:
  • schema – Необязательно, извлекает имена из схемы не по умолчанию. Для специального цитирования используйте quoted_name.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Изменено в версии 2.0: Для тех диалектов, которые ранее включали имена материализованных представлений в этот список (в настоящее время PostgreSQL), этот метод больше не возвращает имена материализованных представлений. Вместо него следует использовать метод Inspector.get_materialized_view_names().

method sqlalchemy.engine.reflection.Inspector.has_index(table_name: str, index_name: str, schema: Optional[str] = None, **kw: Any) bool

Проверка существования определенного имени индекса в базе данных.

Параметры:
  • table_name – имя таблицы, к которой принадлежит индекс

  • index_name – имя индекса для проверки

  • schema – имя схемы для запроса, если не используется схема по умолчанию.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.has_schema(schema_name: str, **kw: Any) bool

Возвращает True, если бэкенд имеет схему с заданным именем.

Параметры:
  • schema_name – имя схемы для проверки

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Добавлено в версии 2.0.

method sqlalchemy.engine.reflection.Inspector.has_sequence(sequence_name: str, schema: Optional[str] = None, **kw: Any) bool

Возвращает True, если бэкенд имеет последовательность с заданным именем.

Параметры:
  • sequence_name – имя последовательности для проверки

  • schema – имя схемы для запроса, если не используется схема по умолчанию.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Добавлено в версии 1.4.

method sqlalchemy.engine.reflection.Inspector.has_table(table_name: str, schema: Optional[str] = None, **kw: Any) bool

Возвращает True, если бэкенд имеет таблицу, представление или временную таблицу с заданным именем.

Параметры:
  • table_name – имя таблицы для проверки

  • schema – имя схемы для запроса, если не используется схема по умолчанию.

  • **kw – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.

Добавлено в версии 1.4: - the Inspector.has_table() method replaces the Engine.has_table() method.

Изменено в версии 2.0::: Inspector.has_table() теперь формально поддерживает проверку дополнительных таблицеподобных объектов:

  • любые типы представлений (простые или материализованные)

  • временные таблицы любого вида

Ранее эти две проверки не были формально определены, и разные диалекты могли отличаться по своему поведению. Теперь набор тестов диалекта включает тесты для всех этих типов объектов и должен поддерживаться всеми диалектами, включенными в SQLAlchemy. Однако поддержка сторонних диалектов может запаздывать.

attribute sqlalchemy.engine.reflection.Inspector.info_cache: Dict[Any, Any]
method sqlalchemy.engine.reflection.Inspector.reflect_table(table: Table, include_columns: Optional[Collection[str]], exclude_columns: Collection[str] = (), resolve_fks: bool = True, _extend_on: Optional[Set[Table]] = None, _reflect_info: Optional[_ReflectionInfo] = None) None

Получив объект Table, загрузите его внутренние конструкции на основе интроспекции.

Это базовый метод, используемый большинством диалектов для создания табличного отражения. Прямое использование выглядит так:

from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy import inspect

engine = create_engine('...')
meta = MetaData()
user_table = Table('user', meta)
insp = inspect(engine)
insp.reflect_table(user_table, None)

Изменено в версии 1.4: Переименовано из reflecttable в reflect_table

Параметры:
  • table – экземпляр Table.

  • include_columns – список строковых имен столбцов для включения в процесс отражения. Если None, то отражаются все столбцы.

method sqlalchemy.engine.reflection.Inspector.sort_tables_on_foreign_key_dependency(consider_schemas: Collection[Optional[str]] = (None,), **kw: Any) List[Tuple[Optional[Tuple[Optional[str], str]], List[Tuple[Tuple[Optional[str], str], Optional[str]]]]]

Возвращает отсортированные по зависимостям имена таблиц и ограничений внешнего ключа, упоминаемые в нескольких схемах.

Этот метод можно сравнить с Inspector.get_sorted_table_and_fkc_names(), который работает с одной схемой за раз; здесь метод является обобщением, которое будет рассматривать несколько схем одновременно, включая то, что он будет разрешать межсхемные внешние ключи.

Добавлено в версии 2.0.

class sqlalchemy.engine.interfaces.ReflectedColumn

Словарь, представляющий отраженные элементы, соответствующие объекту Column.

Структура ReflectedColumn возвращается методом get_columns.

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedColumn (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedColumn.autoincrement: NotRequired[bool]

флаг автоинкремента, зависящий от базы данных.

Этот флаг указывает, имеет ли колонка какой-либо флаг «автоинкремента» со стороны базы данных. В SQLAlchemy другие типы столбцов также могут действовать как «автоинкрементные» столбцы, не обязательно имея такой флаг.

Дополнительные сведения об «автоинкременте» см. в Column.autoincrement.

attribute sqlalchemy.engine.interfaces.ReflectedColumn.comment: NotRequired[Optional[str]]

комментарий для столбца, если он есть. Только некоторые диалекты возвращают этот ключ

attribute sqlalchemy.engine.interfaces.ReflectedColumn.computed: NotRequired[ReflectedComputed]

указывает на то, что этот столбец вычисляется базой данных. Только некоторые диалекты возвращают этот ключ.

Добавлено в версии 1.3.16: - added support for computed reflection.

attribute sqlalchemy.engine.interfaces.ReflectedColumn.default: Optional[str]

выражение по умолчанию столбца в виде строки SQL

attribute sqlalchemy.engine.interfaces.ReflectedColumn.dialect_options: NotRequired[Dict[str, Any]]

Дополнительные опции, специфичные для диалекта, обнаруженные для данного отраженного объекта

attribute sqlalchemy.engine.interfaces.ReflectedColumn.identity: NotRequired[ReflectedIdentity]

указывает, что этот столбец является столбцом IDENTITY. Только некоторые диалекты возвращают этот ключ.

Добавлено в версии 1.4: - added support for identity column reflection.

attribute sqlalchemy.engine.interfaces.ReflectedColumn.name: str

имя столбца

attribute sqlalchemy.engine.interfaces.ReflectedColumn.nullable: bool

булев флаг, если столбец является NULL или NOT NULL

attribute sqlalchemy.engine.interfaces.ReflectedColumn.type: TypeEngine[Any]

тип столбца, представленный в виде экземпляра TypeEngine.

class sqlalchemy.engine.interfaces.ReflectedComputed

Представляют отраженные элементы вычисляемого столбца, соответствующие конструкции Computed.

Структура ReflectedComputed является частью структуры ReflectedColumn, которая возвращается методом Inspector.get_columns().

Members

persisted, sqltext

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedComputed (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedComputed.persisted: NotRequired[bool]

указывает, хранится ли значение в таблице или вычисляется по запросу

attribute sqlalchemy.engine.interfaces.ReflectedComputed.sqltext: str

выражение, используемое для создания этого столбца, возвращаемое в виде строки SQL-выражение

class sqlalchemy.engine.interfaces.ReflectedCheckConstraint

Словарь, представляющий отраженные элементы, соответствующие CheckConstraint.

Структура ReflectedCheckConstraint возвращается методом Inspector.get_check_constraints().

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedCheckConstraint (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedCheckConstraint.dialect_options: NotRequired[Dict[str, Any]]

Дополнительные опции, специфичные для диалекта, обнаруженные для данного ограничения проверки

Добавлено в версии 1.3.8.

attribute sqlalchemy.engine.interfaces.ReflectedCheckConstraint.sqltext: str

SQL-выражение ограничения проверки

class sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint

Словарь, представляющий отраженные элементы, соответствующие ForeignKeyConstraint.

Структура ReflectedForeignKeyConstraint возвращается методом Inspector.get_foreign_keys().

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint.constrained_columns: List[str]

локальные имена столбцов, составляющих внешний ключ

attribute sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint.options: NotRequired[Dict[str, Any]]

Дополнительные опции, обнаруженные для данного ограничения внешнего ключа

attribute sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint.referred_columns: List[str]

имена столбцов, которые соответствуют constrained_columns

attribute sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint.referred_schema: Optional[str]

имя схемы таблицы, на которую ссылаются

attribute sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint.referred_table: str

имя таблицы, на которую ссылаются

class sqlalchemy.engine.interfaces.ReflectedIdentity

представляют отраженную структуру IDENTITY столбца, соответствующую конструкции Identity.

Структура ReflectedIdentity является частью структуры ReflectedColumn, которая возвращается методом Inspector.get_columns().

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedIdentity (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.always: bool

тип идентификационной колонки

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.cache: Optional[int]

количество будущих значений в последовательности, которые вычисляются заранее.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.cycle: bool

позволяет обернуть последовательность, когда достигнуто максимальное или минимальное значение.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.increment: int

значение приращения последовательности

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.maxvalue: int

максимальное значение последовательности.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.minvalue: int

минимальное значение последовательности.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.nomaxvalue: bool

нет максимального значения последовательности.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.nominvalue: bool

нет минимального значения последовательности.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.on_null: bool

указывает на NULL

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.order: bool

если true, отображает ключевое слово ORDER.

attribute sqlalchemy.engine.interfaces.ReflectedIdentity.start: int

начальный индекс последовательности

class sqlalchemy.engine.interfaces.ReflectedIndex

Словарь, представляющий отраженные элементы, соответствующие Index.

Структура ReflectedIndex возвращается методом Inspector.get_indexes().

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedIndex (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedIndex.column_names: List[Optional[str]]

имена столбцов, на которые ссылается индекс. Элемент этого списка None, если это выражение, возвращается в списке expressions.

attribute sqlalchemy.engine.interfaces.ReflectedIndex.column_sorting: NotRequired[Dict[str, Tuple[str]]]

необязательный dict, отображающий имена столбцов или выражений на кортеж ключевых слов сортировки, которые могут включать asc, desc, nulls_first, nulls_last.

Добавлено в версии 1.3.5.

attribute sqlalchemy.engine.interfaces.ReflectedIndex.dialect_options: NotRequired[Dict[str, Any]]

Дополнительные опции, специфичные для диалекта, обнаруженные для этого индекса

attribute sqlalchemy.engine.interfaces.ReflectedIndex.duplicates_constraint: NotRequired[Optional[str]]

Указывает, отражает ли этот индекс ограничение с таким именем.

attribute sqlalchemy.engine.interfaces.ReflectedIndex.expressions: NotRequired[List[str]]

Выражения, составляющие индекс. Этот список, когда он присутствует, содержит как обычные имена столбцов (которые также находятся в column_names), так и выражения (которые находятся None в column_names).

attribute sqlalchemy.engine.interfaces.ReflectedIndex.include_columns: NotRequired[List[str]]

столбцы для включения в предложение INCLUDE для поддерживающих баз данных.

Не рекомендуется, начиная с версии 2.0: Устаревшее значение, будет заменено на index_dict["dialect_options"]["<dialect name>_include"].

attribute sqlalchemy.engine.interfaces.ReflectedIndex.name: Optional[str]

название индекса

attribute sqlalchemy.engine.interfaces.ReflectedIndex.unique: bool

имеет ли индекс уникальный флаг

class sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint

Словарь, представляющий отраженные элементы, соответствующие PrimaryKeyConstraint.

Структура ReflectedPrimaryKeyConstraint возвращается методом Inspector.get_pk_constraint().

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint.constrained_columns: List[str]

имена столбцов, составляющих первичный ключ

attribute sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint.dialect_options: NotRequired[Dict[str, Any]]

Дополнительные опции, специфичные для диалекта, обнаруженные для этого первичного ключа

class sqlalchemy.engine.interfaces.ReflectedUniqueConstraint

Словарь, представляющий отраженные элементы, соответствующие UniqueConstraint.

Структура ReflectedUniqueConstraint возвращается методом Inspector.get_unique_constraints().

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedUniqueConstraint (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedUniqueConstraint.column_names: List[str]

имена столбцов, составляющих уникальное ограничение

attribute sqlalchemy.engine.interfaces.ReflectedUniqueConstraint.dialect_options: NotRequired[Dict[str, Any]]

Дополнительные опции, специфичные для диалекта, обнаруженные для этого уникального ограничения

attribute sqlalchemy.engine.interfaces.ReflectedUniqueConstraint.duplicates_index: NotRequired[Optional[str]]

Указывает, дублирует ли это уникальное ограничение индекс с таким именем.

class sqlalchemy.engine.interfaces.ReflectedTableComment

Словарь, представляющий отраженный комментарий, соответствующий атрибуту Table.comment.

Структура ReflectedTableComment возвращается методом Inspector.get_table_comment().

Members

text

Классная подпись

класс sqlalchemy.engine.interfaces.ReflectedTableComment (builtins.dict)

attribute sqlalchemy.engine.interfaces.ReflectedTableComment.text: Optional[str]

текст комментария

Отражение с помощью типов, не зависящих от базы данных

При отражении столбцов таблицы с помощью параметра Table.autoload_with в Table или метода Inspector.get_columns() в Inspector, типы данных будут как можно более специфичными для целевой базы данных. Это означает, что если тип данных «integer» отражается от базы данных MySQL, то этот тип будет представлен классом sqlalchemy.dialects.mysql.INTEGER, который включает специфические для MySQL атрибуты, такие как «display_width». Или на PostgreSQL может быть возвращен специфический для PostgreSQL тип данных, такой как sqlalchemy.dialects.postgresql.INTERVAL или sqlalchemy.dialects.postgresql.ENUM.

Для рефлексии существует случай использования, когда данный Table должен быть перенесен в базу данных другого производителя. Для этого случая существует техника, с помощью которой эти специфические для поставщика типы данных могут быть преобразованы «на лету» в экземпляры бэкенд-агностических типов данных SQLAlchemy, например, такие типы, как Integer, Interval и Enum. Это может быть достигнуто путем перехвата отражения столбца с помощью события DDLEvents.column_reflect() в сочетании с методом TypeEngine.as_generic().

Дана таблица в MySQL (выбрана потому, что MySQL имеет много специфических для производителя типов данных и опций):

CREATE TABLE IF NOT EXISTS my_table (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    data1 VARCHAR(50) CHARACTER SET latin1,
    data2 MEDIUMINT(4),
    data3 TINYINT(2)
)

Приведенная выше таблица включает целочисленные типы MEDIUMINT и TINYINT, предназначенные только для MySQL, а также VARCHAR, который включает опцию CHARACTER SET, предназначенную только для MySQL. Если мы отразим эту таблицу нормально, то получится объект Table, который будет содержать эти специфические для MySQL типы данных и опции:

>>> from sqlalchemy import MetaData, Table, create_engine
>>> mysql_engine = create_engine("mysql+mysqldb://scott:tiger@localhost/test")
>>> metadata_obj = MetaData()
>>> my_mysql_table = Table("my_table", metadata_obj, autoload_with=mysql_engine)

Приведенный выше пример отражает схему таблицы в новом объекте Table. Затем, для демонстрации, мы можем вывести специфичный для MySQL оператор «CREATE TABLE», используя конструкцию CreateTable:

>>> from sqlalchemy.schema import CreateTable
>>> print(CreateTable(my_mysql_table).compile(mysql_engine))
{printsql}CREATE TABLE my_table (
id INTEGER(11) NOT NULL AUTO_INCREMENT,
data1 VARCHAR(50) CHARACTER SET latin1,
data2 MEDIUMINT(4),
data3 TINYINT(2),
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

Выше были сохранены специфические для MySQL типы данных и опции. Если нам нужен Table, который мы могли бы перенести в другой поставщик баз данных, заменив специальные типы данных sqlalchemy.dialects.mysql.MEDIUMINT и sqlalchemy.dialects.mysql.TINYINT на Integer, мы можем вместо этого «обобщить» типы данных в этой таблице или изменить их любым другим способом, создав обработчик с помощью события DDLEvents.column_reflect(). Пользовательский обработчик будет использовать метод TypeEngine.as_generic() для преобразования вышеуказанных объектов типов, специфичных для MySQL, в общие, заменяя запись "type" в словаре столбцов, который передается обработчику события. Формат этого словаря описан в Inspector.get_columns():

>>> from sqlalchemy import event
>>> metadata_obj = MetaData()

>>> @event.listens_for(metadata_obj, "column_reflect")
... def genericize_datatypes(inspector, tablename, column_dict):
...     column_dict["type"] = column_dict["type"].as_generic()

>>> my_generic_table = Table("my_table", metadata_obj, autoload_with=mysql_engine)

Теперь мы получаем новый Table, который является общим и использует Integer для этих типов данных. Теперь мы можем выдать оператор «CREATE TABLE», например, для базы данных PostgreSQL:

>>> pg_engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test", echo=True)
>>> my_generic_table.create(pg_engine)
{execsql}CREATE TABLE my_table (
    id SERIAL NOT NULL,
    data1 VARCHAR(50),
    data2 INTEGER,
    data3 INTEGER,
    PRIMARY KEY (id)
)

Отметим также, что SQLAlchemy обычно делает приличные предположения относительно других моделей поведения, например, что директива MySQL AUTO_INCREMENT представлена в PostgreSQL наиболее близко с помощью автоинкрементного типа данных SERIAL.

Добавлено в версии 1.4: Добавлен метод TypeEngine.as_generic() и дополнительно улучшено использование события DDLEvents.column_reflect() таким образом, что для удобства оно может быть применено к объекту MetaData.

Ограничения рефлексии

Важно отметить, что процесс отражения воссоздает метаданные Table, используя только ту информацию, которая представлена в реляционной базе данных. Этот процесс по определению не может восстановить аспекты схемы, которые фактически не хранятся в базе данных. Состояние, которое недоступно при отражении, включает, но не ограничивается этим:

  • Умолчания на стороне клиента, либо функции Python, либо выражения SQL, определенные с помощью ключевого слова default в Column (обратите внимание, что это отдельно от server_default, что конкретно доступно через отражение).

  • Информация о столбцах, например, данные, которые могли быть помещены в словарь Column.info

  • Значение настройки .quote для Column или Table

  • Связь конкретного Sequence с конкретным Column

Реляционная база данных также во многих случаях сообщает метаданные таблицы в формате, отличном от того, который был указан в SQLAlchemy. Нельзя всегда полагаться на то, что объекты Table, возвращаемые в результате рефлексии, будут создавать идентичный DDL, как и исходные объекты Table, определяемые Python. К таким областям относятся серверные значения по умолчанию, последовательности, связанные с колонками, и различные идиосинкразии в отношении ограничений и типов данных. Умолчания на стороне сервера могут быть возвращены с помощью директив приведения (обычно PostgreSQL включает приведение ::<type>) или шаблонов цитирования, отличных от первоначально заданных.

Другая категория ограничений включает структуры схем, для которых отражение определено лишь частично или еще не определено. Недавние усовершенствования отражения позволяют отражать такие вещи, как представления, индексы и опции внешних ключей. На данный момент такие структуры, как ограничения CHECK, комментарии к таблицам и триггеры, не отражаются.

Вернуться на верх