Отражение объектов базы данных¶
Объекту 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 |
---|---|
Выполняет проверку схемы базы данных. |
|
Словарь, представляющий отраженные элементы, соответствующие |
|
Словарь, представляющий отраженные элементы, соответствующие объекту |
|
Представляют отраженные элементы вычисляемого столбца, соответствующие конструкции |
|
Словарь, представляющий отраженные элементы, соответствующие |
|
представляют отраженную структуру IDENTITY столбца, соответствующую конструкции |
|
Словарь, представляющий отраженные элементы, соответствующие |
|
Словарь, представляющий отраженные элементы, соответствующие |
|
Словарь, представляющий отраженный комментарий, соответствующий атрибуту |
|
Словарь, представляющий отраженные элементы, соответствующие |
- class sqlalchemy.engine.reflection.Inspector¶
Выполняет проверку схемы базы данных.
Инспектор действует как прокси для методов отражения
Dialect
, обеспечивая согласованный интерфейс, а также поддержку кэширования для ранее полученных метаданных.Объект
Inspector
обычно создается с помощью функцииinspect()
, которой может быть переданEngine
илиConnection
:from sqlalchemy import inspect, create_engine engine = create_engine('...') insp = inspect(engine)
Там, где это указано выше,
Dialect
, связанный с движком, может выбрать для возвратаInspector
подкласс, который предоставляет дополнительные методы, специфичные для целевой базы данных диалекта.Members
__init__(), bind, clear_cache(), default_schema_name, dialect, engine, from_engine(), get_check_constraints(), get_columns(), get_foreign_keys(), get_indexes(), get_materialized_view_names(), get_multi_check_constraints(), get_multi_columns(), get_multi_foreign_keys(), get_multi_indexes(), get_multi_pk_constraint(), get_multi_table_comment(), get_multi_table_options(), get_multi_unique_constraints(), get_pk_constraint(), get_schema_names(), get_sequence_names(), get_sorted_table_and_fkc_names(), get_table_comment(), get_table_names(), get_table_options(), get_temp_table_names(), get_temp_view_names(), get_unique_constraints(), get_view_definition(), get_view_names(), has_index(), has_schema(), has_sequence(), has_table(), info_cache, reflect_table(), sort_tables_on_foreign_key_dependency()
Классная подпись
класс
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
.- Параметры:
bind –
Connection
, который обычно является экземпляром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
.- Параметры:
bind –
Connection
или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.
См.также
-
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.
См.также
-
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.
См.также
-
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 – Дополнительный аргумент с ключевым словом для передачи в реализацию, зависящую от диалекта. Для получения дополнительной информации см. документацию используемого диалекта.
См.также
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 theEngine.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.
-
method
- class sqlalchemy.engine.interfaces.ReflectedColumn¶
Словарь, представляющий отраженные элементы, соответствующие объекту
Column
.Структура
ReflectedColumn
возвращается методомget_columns
.Members
autoincrement, comment, computed, default, dialect_options, identity, name, nullable, type
Классная подпись
класс
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
.
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedComputed¶
Представляют отраженные элементы вычисляемого столбца, соответствующие конструкции
Computed
.Структура
ReflectedComputed
является частью структурыReflectedColumn
, которая возвращается методомInspector.get_columns()
.Классная подпись
класс
sqlalchemy.engine.interfaces.ReflectedComputed
(builtins.dict
)-
attribute
sqlalchemy.engine.interfaces.ReflectedComputed.
persisted: NotRequired[bool]¶ указывает, хранится ли значение в таблице или вычисляется по запросу
-
attribute
sqlalchemy.engine.interfaces.ReflectedComputed.
sqltext: str¶ выражение, используемое для создания этого столбца, возвращаемое в виде строки SQL-выражение
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedCheckConstraint¶
Словарь, представляющий отраженные элементы, соответствующие
CheckConstraint
.Структура
ReflectedCheckConstraint
возвращается методомInspector.get_check_constraints()
.Members
Классная подпись
класс
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-выражение ограничения проверки
-
attribute
- 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¶ имя таблицы, на которую ссылаются
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedIdentity¶
представляют отраженную структуру IDENTITY столбца, соответствующую конструкции
Identity
.Структура
ReflectedIdentity
является частью структурыReflectedColumn
, которая возвращается методомInspector.get_columns()
.Members
always, cache, cycle, increment, maxvalue, minvalue, nomaxvalue, nominvalue, on_null, order, start
Классная подпись
класс
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¶ начальный индекс последовательности
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedIndex¶
Словарь, представляющий отраженные элементы, соответствующие
Index
.Структура
ReflectedIndex
возвращается методомInspector.get_indexes()
.Members
column_names, column_sorting, dialect_options, duplicates_constraint, expressions, include_columns, name, unique
Классная подпись
класс
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¶ имеет ли индекс уникальный флаг
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint¶
Словарь, представляющий отраженные элементы, соответствующие
PrimaryKeyConstraint
.Структура
ReflectedPrimaryKeyConstraint
возвращается методомInspector.get_pk_constraint()
.Members
Классная подпись
класс
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]]¶ Дополнительные опции, специфичные для диалекта, обнаруженные для этого первичного ключа
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedUniqueConstraint¶
Словарь, представляющий отраженные элементы, соответствующие
UniqueConstraint
.Структура
ReflectedUniqueConstraint
возвращается методомInspector.get_unique_constraints()
.Members
Классная подпись
класс
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]]¶ Указывает, дублирует ли это уникальное ограничение индекс с таким именем.
-
attribute
- class sqlalchemy.engine.interfaces.ReflectedTableComment¶
Словарь, представляющий отраженный комментарий, соответствующий атрибуту
Table.comment
.Структура
ReflectedTableComment
возвращается методомInspector.get_table_comment()
.Members
Классная подпись
класс
sqlalchemy.engine.interfaces.ReflectedTableComment
(builtins.dict
)-
attribute
sqlalchemy.engine.interfaces.ReflectedTableComment.
text: Optional[str]¶ текст комментария
-
attribute
Отражение с помощью типов, не зависящих от базы данных¶
При отражении столбцов таблицы с помощью параметра 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
Реляционная база данных также во многих случаях сообщает метаданные таблицы в формате, отличном от того, который был указан в SQLAlchemy. Нельзя всегда полагаться на то, что объекты Table
, возвращаемые в результате рефлексии, будут создавать идентичный DDL, как и исходные объекты Table
, определяемые Python. К таким областям относятся серверные значения по умолчанию, последовательности, связанные с колонками, и различные идиосинкразии в отношении ограничений и типов данных. Умолчания на стороне сервера могут быть возвращены с помощью директив приведения (обычно PostgreSQL включает приведение ::<type>
) или шаблонов цитирования, отличных от первоначально заданных.
Другая категория ограничений включает структуры схем, для которых отражение определено лишь частично или еще не определено. Недавние усовершенствования отражения позволяют отражать такие вещи, как представления, индексы и опции внешних ключей. На данный момент такие структуры, как ограничения CHECK, комментарии к таблицам и триггеры, не отражаются.