SELECT и связанные с ним конструкции¶
Термин «выбираемый» относится к любому объекту, который представляет строки базы данных. В SQLAlchemy эти объекты восходят к Selectable
, наиболее известным из которых является Select
, представляющий оператор SQL SELECT. Подмножеством Selectable
является FromClause
, который представляет объекты, которые могут находиться в предложении FROM оператора Select
. Отличительной особенностью FromClause
является атрибут FromClause.c
, который представляет собой пространство имен всех столбцов, содержащихся в предложении FROM (эти элементы сами являются подклассами ColumnElement
).
Выбираемые фундаментальные конструкторы¶
Конструкторы верхнего уровня «FROM clause» и «SELECT».
Object Name | Description |
---|---|
except_(*selects) |
Возвращает |
except_all(*selects) |
Возвращает |
exists([__argument]) |
Создайте новую конструкцию |
intersect(*selects) |
Возвращает |
intersect_all(*selects) |
Возвращает |
select(*entities, **__kw) |
Создайте новый |
table(name, *columns, **kw) |
Произведите новый |
union(*selects) |
Возвращает |
union_all(*selects) |
Возвращает |
values(*columns, [name, literal_binds]) |
Создайте конструкцию |
- function sqlalchemy.sql.expression.except_(*selects: _SelectStatementForCompoundArgument) → CompoundSelect¶
Возвращает
EXCEPT
из нескольких выбираемых элементов.Возвращаемый объект является экземпляром
CompoundSelect
.- Параметры:
*selects – список экземпляров
Select
.
- function sqlalchemy.sql.expression.except_all(*selects: _SelectStatementForCompoundArgument) → CompoundSelect¶
Возвращает
EXCEPT ALL
из нескольких выбираемых элементов.Возвращаемый объект является экземпляром
CompoundSelect
.- Параметры:
*selects – список экземпляров
Select
.
- function sqlalchemy.sql.expression.exists(__argument: Optional[Union[_ColumnsClauseArgument[Any], SelectBase, ScalarSelect[Any]]] = None) → Exists¶
Создайте новую конструкцию
Exists
.exists()
может быть вызвана сама по себе для создания конструкцииExists
, которая будет принимать простые критерии WHERE:exists_criteria = exists().where(table1.c.col1 == table2.c.col2)
Однако для большей гибкости при построении SELECT существующая конструкция
Select
может быть преобразована вExists
, что наиболее удобно при использовании методаSelectBase.exists()
:exists_criteria = ( select(table2.c.col2). where(table1.c.col1 == table2.c.col2). exists() )
Критерий EXISTS затем используется внутри вложенного SELECT:
stmt = select(table1.c.col1).where(exists_criteria)
Тогда приведенное выше утверждение будет иметь вид:
SELECT col1 FROM table1 WHERE EXISTS (SELECT table2.col2 FROM table2 WHERE table2.col2 = table1.col1)
См.также
подзапросы EXISTS - в учебнике 2.0 style.
SelectBase.exists()
- метод преобразования предложенияSELECT
в предложениеEXISTS
.
- function sqlalchemy.sql.expression.intersect(*selects: _SelectStatementForCompoundArgument) → CompoundSelect¶
Возвращает
INTERSECT
из нескольких выбираемых элементов.Возвращаемый объект является экземпляром
CompoundSelect
.- Параметры:
*selects – список экземпляров
Select
.
- function sqlalchemy.sql.expression.intersect_all(*selects: _SelectStatementForCompoundArgument) → CompoundSelect¶
Возвращает
INTERSECT ALL
из нескольких выбираемых элементов.Возвращаемый объект является экземпляром
CompoundSelect
.- Параметры:
*selects – список экземпляров
Select
.
- function sqlalchemy.sql.expression.select(*entities: _ColumnsClauseArgument[Any], **__kw: Any) → Select[Any]¶
Создайте новый
Select
.Добавлено в версии 1.4: - The
select()
function now accepts column arguments positionally. The top-levelselect()
function will automatically use the 1.x or 2.x style API based on the incoming arguments; usingselect()
from thesqlalchemy.future
module will enforce that only the 2.x style constructor is used.Подобная функциональность также доступна через метод
FromClause.select()
на любомFromClause
.- Параметры:
*entities – Объекты для ВЫБОРА. Для использования в Core это обычно серия объектов
ColumnElement
и/илиFromClause
, которые образуют пункт columns результирующего оператора. Для тех объектов, которые являются экземплярамиFromClause
(обычноTable
илиAlias
), коллекцияFromClause.c
извлекается для формирования коллекцииColumnElement
объектов. Этот параметр также принимает конструкцииTextClause
как заданные, а также ORM-сопоставленные классы.
- function sqlalchemy.sql.expression.table(name: str, *columns: ColumnClause[Any], **kw: Any) → TableClause¶
Произведите новый
TableClause
.Возвращаемый объект является экземпляром
TableClause
, который представляет собой «синтаксическую» часть объекта уровня схемыTable
. Он может быть использован для построения облегченных конструкций таблиц.
- function sqlalchemy.sql.expression.union(*selects: _SelectStatementForCompoundArgument) → CompoundSelect¶
Возвращает
UNION
из нескольких выбираемых элементов.Возвращаемый объект является экземпляром
CompoundSelect
.Аналогичный метод
union()
доступен для всех подклассовFromClause
.
- function sqlalchemy.sql.expression.union_all(*selects: _SelectStatementForCompoundArgument) → CompoundSelect¶
Возвращает
UNION ALL
из нескольких выбираемых элементов.Возвращаемый объект является экземпляром
CompoundSelect
.Аналогичный метод
union_all()
доступен для всех подклассовFromClause
.- Параметры:
*selects – список экземпляров
Select
.
- function sqlalchemy.sql.expression.values(*columns: ColumnClause[Any], name: Optional[str] = None, literal_binds: bool = False) → Values¶
Создайте конструкцию
Values
.Выражения столбцов и фактические данные для
Values
передаются в два отдельных этапа. Конструктор получает выражения столбцов обычно в виде конструкцийcolumn()
, а данные затем передаются через методValues.data()
в виде списка, который можно вызывать несколько раз для добавления дополнительных данных, например:from sqlalchemy import column from sqlalchemy import values value_expr = values( column('id', Integer), column('name', String), name="my_values" ).data( [(1, 'name1'), (2, 'name2'), (3, 'name3')] )
- Параметры:
*columns – выражения столбцов, обычно составленные с использованием объектов
column()
.name – имя для данной конструкции VALUES. Если опущено, конструкция VALUES будет безымянной в выражении SQL. Различные бэкенды могут предъявлять разные требования.
literal_binds – По умолчанию имеет значение False. Выводить или нет значения данных в линию в выводе SQL, а не использовать связанные параметры.
Конструкторы модификаторов с возможностью выбора¶
Перечисленные здесь функции чаще всего доступны как методы из элементов FromClause
и Selectable
, например, функция alias()
обычно вызывается через метод FromClause.alias()
.
Object Name | Description |
---|---|
alias(selectable[, name, flat]) |
Возвращает именованный псевдоним заданного |
cte(selectable[, name, recursive]) |
Возвращает новый экземпляр |
join(left, right[, onclause, isouter, ...]) |
Произвести объект |
lateral(selectable[, name]) |
Возвращает объект |
outerjoin(left, right[, onclause, full]) |
Возвращает элемент клаузулы |
tablesample(selectable, sampling[, name, seed]) |
Возвращает объект |
- function sqlalchemy.sql.expression.alias(selectable: FromClause, name: Optional[str] = None, flat: bool = False) → NamedFromClause¶
Возвращает именованный псевдоним заданного
FromClause
.Для объектов
Table
иJoin
возвращаемым типом является объектAlias
. Для других видов объектовNamedFromClause
могут быть возвращены другие виды объектовFromClause
.Именованный псевдоним представляет собой любое
FromClause
с альтернативным именем, назначенным в SQL, обычно с помощью предложенияAS
при генерации, напримерSELECT * FROM table AS aliasname
.Эквивалентная функциональность доступна через метод
FromClause.alias()
, доступный для всех объектовFromClause
.- Параметры:
selectable – любой подкласс
FromClause
, такой как таблица, оператор select и т.д.name – строковое имя, которое будет назначено в качестве псевдонима. Если
None
, имя будет детерминированно генерироваться во время компиляции. Детерминированность означает, что имя гарантированно будет уникальным по отношению к другим конструкциям, используемым в том же операторе, а также будет тем же именем при каждой последующей компиляции одного и того же объекта оператора.flat – Будет передан, если данный selectable является экземпляром
Join
- подробности см. вJoin.alias()
.
- function sqlalchemy.sql.expression.cte(selectable: HasCTE, name: Optional[str] = None, recursive: bool = False) → CTE¶
Возвращает новый экземпляр
CTE
, или Common Table Expression.Подробную информацию об использовании CTE смотрите в
HasCTE.cte()
.
- function sqlalchemy.sql.expression.join(left: _FromClauseArgument, right: _FromClauseArgument, onclause: Optional[_OnClauseArgument] = None, isouter: bool = False, full: bool = False) → Join¶
Произвести объект
Join
, заданный двумя выражениямиFromClause
.Например:
j = join(user_table, address_table, user_table.c.id == address_table.c.user_id) stmt = select(user_table).select_from(j)
будет выдавать SQL примерно следующего содержания:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
Аналогичная функциональность доступна для любого объекта
FromClause
(например, такого какTable
) с помощью методаFromClause.join()
.- Параметры:
left – Левая сторона соединения.
right – правая сторона соединения; это любой объект
FromClause
, например, объектTable
, а также может быть совместимым с selectable объектом, например, ORM-mapped class.onclause – выражение SQL, представляющее предложение ON для объединения. Если оставить значение
None
,FromClause.join()
попытается объединить две таблицы на основе отношения внешнего ключа.isouter – если True, отображает LEFT OUTER JOIN вместо JOIN.
full – если True, отображает FULL OUTER JOIN, вместо JOIN.
См.также
FromClause.join()
- форма метода, основанная на заданной левой части.Join
- тип производимого объекта.
- function sqlalchemy.sql.expression.lateral(selectable: Union[SelectBase, _FromClauseArgument], name: Optional[str] = None) → LateralFromClause¶
Возвращает объект
Lateral
.Lateral
является подклассомAlias
, который представляет подзапрос с примененным к нему ключевым словом LATERAL.Особенность поведения подзапроса LATERAL заключается в том, что он появляется в предложении FROM вложенного SELECT, но может соотноситься с другими предложениями FROM этого SELECT. Это особый случай подзапроса, который поддерживается только небольшим числом бэкендов, в настоящее время более поздними версиями PostgreSQL.
См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
- function sqlalchemy.sql.expression.outerjoin(left: _FromClauseArgument, right: _FromClauseArgument, onclause: Optional[_OnClauseArgument] = None, full: bool = False) → Join¶
Возвращает элемент клаузулы
OUTER JOIN
.Возвращаемый объект является экземпляром
Join
.Подобная функциональность также доступна через метод
FromClause.outerjoin()
на любомFromClause
.- Параметры:
left – Левая сторона соединения.
right – Правая сторона соединения.
onclause – Необязательный критерий для условия
ON
, выводится из отношений внешних ключей, установленных между левым и правым иными.
Чтобы составить цепочку соединений, используйте методы
FromClause.join()
илиFromClause.outerjoin()
для результирующего объектаJoin
.
- function sqlalchemy.sql.expression.tablesample(selectable: _FromClauseArgument, sampling: Union[float, Function[Any]], name: Optional[str] = None, seed: Optional[roles.ExpressionElementRole[Any]] = None) → TableSample¶
Возвращает объект
TableSample
.TableSample
- это подклассAlias
, который представляет таблицу с примененным к ней предложением TABLESAMPLE.tablesample()
также доступен из классаFromClause
через методFromClause.tablesample()
.Пункт TABLESAMPLE позволяет выбрать случайным образом приблизительный процент строк из таблицы. Он поддерживает несколько методов выборки, чаще всего BERNOULLI и SYSTEM.
например:
from sqlalchemy import func selectable = people.tablesample( func.bernoulli(1), name='alias', seed=func.random()) stmt = select(selectable.c.people_id)
Если предположить, что
people
с колонкойpeople_id
, то вышеприведенное утверждение будет выглядеть так:SELECT alias.people_id FROM people AS alias TABLESAMPLE bernoulli(:bernoulli_1) REPEATABLE (random())
- Параметры:
sampling – процент
float
между 0 и 100 илиFunction
.name – необязательное имя псевдонима
seed – любое действительное выражение SQL. Если указано, то подпункт REPEATABLE также отображается.
Документация выбираемого класса¶
Классы, представленные здесь, создаются с помощью конструкторов, перечисленных в Выбираемые фундаментальные конструкторы и Конструкторы модификаторов с возможностью выбора.
Object Name | Description |
---|---|
Представляет собой таблицу или выбираемый псевдоним (AS). |
|
Базовый класс псевдонимов для таблиц, подзапросов и других selectables. |
|
Формирует основу |
|
Представьте общее табличное выражение. |
|
Пометить |
|
Представляет собой клаузулу |
|
Представляет собой элемент, который может быть использован в пункте |
|
Базовый класс для операторов SELECT, в который могут быть добавлены дополнительные элементы. |
|
Миксин, который объявляет класс для включения поддержки CTE. |
|
Представляет собой конструкцию |
|
Представляет собой ЛАТЕРАЛЬНЫЙ подзапрос. |
|
Самый базовый класс для конструкций Core, которые имеют некоторую концепцию столбцов, которые могут представлять строки. |
|
Представляет собой скалярный подзапрос. |
|
Представляет собой скалярную конструкцию |
|
Представляет собой оператор |
|
Пометить класс как выбираемый. |
|
Базовый класс для операторов SELECT. |
|
Представляет собой подзапрос SELECT. |
|
Представляет собой минимальную конструкцию «таблицы». |
|
Представьте предложение TABLESAMPLE. |
|
Псевдоним для «табличной» функции SQL. |
|
Оберните конструкцию |
|
Представляет собой конструкцию |
- class sqlalchemy.sql.expression.Alias¶
Представляет собой таблицу или выбираемый псевдоним (AS).
Представляет собой псевдоним, который обычно применяется к любой таблице или подвыборке в операторе SQL с помощью ключевого слова
AS
(или без ключевого слова в некоторых базах данных, таких как Oracle).Этот объект строится из функции уровня модуля
alias()
, а также методаFromClause.alias()
, доступного для всех подклассовFromClause
.См.также
Members
Классная подпись
класс
sqlalchemy.sql.expression.Alias
(sqlalchemy.sql.roles.DMLTableRole
,sqlalchemy.sql.expression.FromClauseAlias
)-
attribute
sqlalchemy.sql.expression.Alias.
inherit_cache: Optional[bool] = True¶ Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
attribute
- class sqlalchemy.sql.expression.AliasedReturnsRows¶
Базовый класс псевдонимов для таблиц, подзапросов и других selectables.
Members
Классная подпись
класс
sqlalchemy.sql.expression.AliasedReturnsRows
(sqlalchemy.sql.expression.NoInit
,sqlalchemy.sql.expression.NamedFromClause
)-
attribute
sqlalchemy.sql.expression.AliasedReturnsRows.
description¶
-
method
sqlalchemy.sql.expression.AliasedReturnsRows.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ Возвращает
True
, если данныйFromClause
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
attribute
sqlalchemy.sql.expression.AliasedReturnsRows.
original¶ Наследие для диалектов, которые ссылаются на Alias.original.
-
attribute
- class sqlalchemy.sql.expression.CompoundSelect¶
Формирует основу
UNION
,UNION ALL
и других операций с множествами на основе SELECT.Members
add_cte(), alias(), as_scalar(), c, corresponding_column(), cte(), execution_options(), exists(), exported_columns, fetch(), get_execution_options(), get_label_style(), group_by(), is_derived_from(), label(), lateral(), limit(), offset(), options(), order_by(), replace_selectable(), scalar_subquery(), select(), selected_columns, self_group(), set_label_style(), slice(), subquery(), with_for_update()
Классная подпись
class
sqlalchemy.sql.expression.CompoundSelect
(sqlalchemy.sql.expression.HasCompileState
,sqlalchemy.sql.expression.GenerativeSelect
,sqlalchemy.sql.expression.ExecutableReturnsRows
)-
method
sqlalchemy.sql.expression.CompoundSelect.
add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ наследуется от
HasCTE.add_cte()
методаHasCTE
Добавьте к этому утверждению одну или несколько конструкций
CTE
.Этот метод свяжет заданные конструкции
CTE
с родительским оператором таким образом, что каждая из них будет безоговорочно отображена в предложение WITH конечного оператора, даже если на нее нет ссылок в других местах оператора или вложенных селектов.Необязательный параметр
HasCTE.add_cte.nest_here
при установке в True будет иметь тот эффект, что каждый данныйCTE
будет отображаться в предложении WITH, отображаемом непосредственно вместе с этим утверждением, а не перемещаться в начало конечного отображаемого утверждения, даже если это утверждение отображается как подзапрос внутри более крупного утверждения.Этот метод имеет два общих применения. Первое - это встраивание операторов CTE, которые служат некоторым целям без явных ссылок, например, в случае встраивания оператора DML, такого как INSERT или UPDATE, в качестве CTE в линию с основным оператором, который может косвенно использовать его результаты. Другая задача - обеспечить контроль над точным размещением определенной серии конструкций CTE, которые должны оставаться отображенными непосредственно в терминах конкретного оператора, который может быть вложен в более крупный оператор.
Например:
from sqlalchemy import table, column, select t = table('t', column('c1'), column('c2')) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
Будет оказывать:
WITH anon_1 AS (INSERT INTO t (c1, c2) VALUES (:param_1, :param_2)) SELECT t.c1, t.c2 FROM t
Выше, CTE «anon_1» не упоминается в операторе SELECT, но все же выполняет задачу запуска оператора INSERT.
Аналогично в контексте, связанном с DML, использование конструкции PostgreSQL
Insert
для создания «upsert»:from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = ( t.delete().where(t.c.c1 < 1).cte("deletions") ) insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
Вышеприведенное утверждение выглядит следующим образом:
WITH deletions AS (DELETE FROM t WHERE t.c1 < %(c1_1)s) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
Добавлено в версии 1.4.21.
- Параметры:
*ctes – ноль или более конструкций
CTE
. … versionchanged:: 2.0 Принимаются несколько экземпляров CTEnest_here – если True, то данный CTE или CTE будут отображаться так, как если бы при добавлении их в данный
HasCTE
был указан флагHasCTE.cte.nesting
вTrue
. Если предполагается, что на данные CTE не ссылаются во внешнем охватывающем утверждении, то при установке этого флага данные CTE будут отображаться на уровне этого утверждения. … версия добавлена:: 2.0 .. seealso::HasCTE.cte.nesting
-
method
sqlalchemy.sql.expression.CompoundSelect.
alias(name: Optional[str] = None, flat: bool = False) → Subquery¶ наследуется от
SelectBase.alias()
методаSelectBase
Возвращает именованный подзапрос к данному
SelectBase
.Для
SelectBase
(в отличие отFromClause
) это возвращает объектSubquery
, который ведет себя в основном так же, как объектAlias
, который используется сFromClause
.Изменено в версии 1.4: Метод
SelectBase.alias()
теперь является синонимом методаSelectBase.subquery()
.
-
method
sqlalchemy.sql.expression.CompoundSelect.
as_scalar() → ScalarSelect[Any]¶ наследуется от
SelectBase.as_scalar()
методаSelectBase
Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.as_scalar()
является устаревшим и будет удален в одном из будущих выпусков. Пожалуйста, обратитесь кSelectBase.scalar_subquery()
.
-
attribute
sqlalchemy.sql.expression.CompoundSelect.
c¶ наследуется от
SelectBase.c
атрибутаSelectBase
Не рекомендуется, начиная с версии 1.4: Атрибуты
SelectBase.c
иSelectBase.columns
устарели и будут удалены в будущем релизе; эти атрибуты неявно создают подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем будет содержать этот атрибут. Для доступа к столбцам, из которых выбирает данный объект SELECT, используйте атрибутSelectBase.selected_columns
.
-
method
sqlalchemy.sql.expression.CompoundSelect.
corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → Optional[KeyedColumnElement[Any]]¶ наследуется от
Selectable.corresponding_column()
методаSelectable
Учитывая
ColumnElement
, возвращает экспортированный объектColumnElement
из коллекцииSelectable.exported_columns
данногоSelectable
, который соответствует исходномуColumnElement
через общий граф предков.- Параметры:
column – цель
ColumnElement
для сопоставления.require_embedded – возвращает соответствующие столбцы для данного
ColumnElement
только в том случае, если данныйColumnElement
действительно присутствует в подэлементе данногоSelectable
. Обычно столбец будет соответствовать, если он просто имеет общего предка с одним из экспортированных столбцов данногоSelectable
.
См.также
Selectable.exported_columns
-ColumnCollection
, который используется для операции.ColumnCollection.corresponding_column()
- метод реализации.
-
method
sqlalchemy.sql.expression.CompoundSelect.
cte(name: Optional[str] = None, recursive: bool = False, nesting: bool = False) → CTE¶ наследуется от
HasCTE.cte()
методаHasCTE
Возвращает новый экземпляр
CTE
, или Common Table Expression.Общие табличные выражения - это стандарт SQL, согласно которому операторы SELECT могут использовать вторичные операторы, указанные вместе с первичным оператором, используя предложение под названием «WITH». Специальная семантика UNION также может быть использована для обеспечения «рекурсивных» запросов, когда оператор SELECT может использовать набор строк, которые были выбраны ранее.
CTE также могут применяться к конструкциям DML UPDATE, INSERT и DELETE в некоторых базах данных, как в качестве источника строк CTE в сочетании с RETURNING, так и в качестве потребителя строк CTE.
SQLAlchemy определяет объекты
CTE
, которые рассматриваются аналогично объектамAlias
, как специальные элементы, которые должны быть доставлены в предложение FROM оператора, а также в предложение WITH в верхней части оператора.Для специальных префиксов, таких как PostgreSQL «MATERIALIZED» и «NOT MATERIALIZED», можно использовать метод
CTE.prefix_with()
для их установления.Изменено в версии 1.3.13: Добавлена поддержка префиксов. В частности - МАТЕРИАЛИЗОВАННЫЙ и НЕ МАТЕРИАЛИЗОВАННЫЙ.
- Параметры:
name – имя, присваиваемое общему табличному выражению. Как и
FromClause.alias()
, имя может быть оставлено какNone
, в этом случае во время компиляции запроса будет использоваться анонимный символ.recursive – если
True
, будет отображатьсяWITH RECURSIVE
. Рекурсивное выражение общей таблицы предназначено для использования в сочетании с UNION ALL, чтобы вывести строки из уже выбранных.nesting – если
True
, то CTE будет отображаться локально в операторе, в котором на него ссылаются. Для более сложных сценариев можно также использовать методHasCTE.add_cte()
с параметромHasCTE.add_cte.nest_here
для более тщательного контроля точного размещения конкретного CTE. … версия добавлена:: 1.4.24 .. seealso::HasCTE.add_cte()
Ниже приведены два примера из документации PostgreSQL по адресу https://www.postgresql.org/docs/current/static/queries-with.html, а также дополнительные примеры.
Пример 1, нерекурсивный:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() orders = Table('orders', metadata, Column('region', String), Column('amount', Integer), Column('product', String), Column('quantity', Integer) ) regional_sales = select( orders.c.region, func.sum(orders.c.amount).label('total_sales') ).group_by(orders.c.region).cte("regional_sales") top_regions = select(regional_sales.c.region).\ where( regional_sales.c.total_sales > select( func.sum(regional_sales.c.total_sales) / 10 ) ).cte("top_regions") statement = select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales") ).where(orders.c.region.in_( select(top_regions.c.region) )).group_by(orders.c.region, orders.c.product) result = conn.execute(statement).fetchall()
Пример 2, С РЕКУРСИВНЫМ:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() parts = Table('parts', metadata, Column('part', String), Column('sub_part', String), Column('quantity', Integer), ) included_parts = select(\ parts.c.sub_part, parts.c.part, parts.c.quantity\ ).\ where(parts.c.part=='our part').\ cte(recursive=True) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).\ where(parts_alias.c.part==incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity). label('total_quantity') ).\ group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
Пример 3, апсерт с использованием UPDATE и INSERT с CTE:
from datetime import date from sqlalchemy import (MetaData, Table, Column, Integer, Date, select, literal, and_, exists) metadata = MetaData() visitors = Table('visitors', metadata, Column('product_id', Integer, primary_key=True), Column('date', Date, primary_key=True), Column('count', Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where(and_(visitors.c.product_id == product_id, visitors.c.date == day)) .values(count=visitors.c.count + count) .returning(literal(1)) .cte('update_cte') ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)) .where(~exists(update_cte.select())) ) connection.execute(upsert)
Пример 4, Вложение CTE (SQLAlchemy 1.4.24 и выше):
value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a", nesting=True) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Приведенный выше запрос выведет второй CTE, вложенный в первый, показанный с инлайн-параметрами ниже как:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
Тот же CTE можно настроить с помощью метода
HasCTE.add_cte()
следующим образом (SQLAlchemy 2.0 и выше):value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n). add_cte(value_a_nested, nest_here=True). cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Пример 5, нелинейный CTE (SQLAlchemy 1.4.28 и выше):
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte( "nodes", recursive=True ) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
Приведенный выше запрос выведет 2 UNION внутри рекурсивного CTE:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
См.также
Query.cte()
- ORM-версияHasCTE.cte()
.
-
method
sqlalchemy.sql.expression.CompoundSelect.
execution_options(**kw: Any) → Self¶ наследуется от
Executable.execution_options()
методаExecutable
Установите для оператора параметры, не относящиеся к SQL, которые вступают в силу во время выполнения.
Параметры выполнения могут быть установлены в различных масштабах, в том числе на запрос, на соединение или на выполнение, с помощью таких методов, как
Connection.execution_options()
и параметров, которые принимают словарь параметров, таких какConnection.execute.execution_options
иSession.execute.execution_options
.Основной характеристикой опции выполнения, в отличие от других видов опций, таких как опции загрузчика ORM, является то, что опции выполнения никогда не влияют на скомпилированный SQL запроса, только на то, что влияет на то, как вызывается сам SQL-запрос или как извлекаются результаты. То есть опции выполнения не являются частью того, что учитывается при компиляции SQL, и не считаются частью кэшированного состояния оператора.
Метод
Executable.execution_options()
является generative, как и в случае применения метода к объектамEngine
иQuery
, что означает, что при вызове метода возвращается копия объекта, которая применяет заданные параметры к этой новой копии, но оставляет оригинал неизменным:statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
Исключением из этого поведения является объект
Connection
, где методConnection.execution_options()
явно не генеративный.Типы параметров, которые могут быть переданы в
Executable.execution_options()
и другие связанные методы и словари параметров, включают параметры, которые явно потребляются SQLAlchemy Core или ORM, а также произвольные аргументы ключевых слов, не определенные SQLAlchemy, что означает, что методы и/или словари параметров могут использоваться для определяемых пользователем параметров, которые взаимодействуют с пользовательским кодом, который может обращаться к параметрам с помощью таких методов, какExecutable.get_execution_options()
иConnection.get_execution_options()
, или в рамках выбранных крючков событий с помощью специального параметра событияexecution_options
, такого какConnectionEvents.before_execute.execution_options
илиORMExecuteState.execution_options
, например. g.:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
В рамках опций, которые явно распознаются SQLAlchemy, большинство из них применяются к определенным классам объектов, а не к другим. К наиболее распространенным опциям выполнения относятся:
Connection.execution_options.isolation_level
- устанавливает уровень изоляции для соединения или класса соединений черезEngine
. Этот параметр принимается толькоConnection
илиEngine
.Connection.execution_options.stream_results
- указывает, что результаты должны быть получены с помощью курсора на стороне сервера; эта опция принимаетсяConnection
, параметромConnection.execute.execution_options
наConnection.execute()
, и дополнительноExecutable.execution_options()
на объекте оператора SQL, а также конструкциями ORM, такими какSession.execute()
.Connection.execution_options.compiled_cache
- указывает словарь, который будет служить SQL compilation cache дляConnection
илиEngine
, а также для методов ORM, таких какSession.execute()
. Может быть передан какNone
, чтобы отключить кэширование для утверждений. Эта опция не принимаетсяExecutable.execution_options()
, поскольку нежелательно переносить кэш компиляции внутри объекта statement.Connection.execution_options.schema_translate_map
- отображение имен схем, используемых функцией Schema Translate Map, принимаемых функциямиConnection
,Engine
,Executable
, а также конструкциями ORM, такими какSession.execute()
.
См.также
Connection.execution_options()
Connection.execute.execution_options
Session.execute.execution_options
Варианты выполнения ORM - документация по всем специфическим для ORM опциям исполнения
-
method
sqlalchemy.sql.expression.CompoundSelect.
exists() → Exists¶ наследуется от
SelectBase.exists()
методаSelectBase
Возвращает
Exists
представление этого selectable, которое может быть использовано как выражение столбца.Возвращаемый объект является экземпляром
Exists
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.CompoundSelect.
exported_columns¶ наследуется от
SelectBase.exported_columns
атрибутаSelectBase
ColumnCollection
, который представляет «экспортированные» столбцы данногоSelectable
, не включая конструкцииTextClause
.«Экспортируемые» столбцы для объекта
SelectBase
являются синонимом коллекцииSelectBase.selected_columns
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.CompoundSelect.
fetch(count: _LimitOffsetType, with_ties: bool = False, percent: bool = False) → Self¶ наследуется от
GenerativeSelect.fetch()
методаGenerativeSelect
Возвращает новый selectable с заданным критерием FETCH FIRST.
Это числовое значение, которое обычно отображается как выражение
FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}
в результирующем select. Эта функциональность в настоящее время реализована для Oracle, PostgreSQL, MSSQL.Используйте
GenerativeSelect.offset()
для указания смещения.Примечание
Метод
GenerativeSelect.fetch()
заменит любую оговорку, примененную с помощьюGenerativeSelect.limit()
.Добавлено в версии 1.4.
- Параметры:
count – целочисленный параметр COUNT или выражение SQL, которое дает целочисленный результат. При
percent=True
это значение будет представлять процент возвращаемых строк, а не абсолютное значение. ПередайтеNone
, чтобы сбросить его.with_ties – Когда
True
, опция WITH TIES используется для возврата всех дополнительных строк, которые занимают последнее место в наборе результатов в соответствии с предложениемORDER BY
. ПараметрORDER BY
может быть обязательным в этом случае. По умолчанию используетсяFalse
.percent – Когда
True
,count
представляет собой процент от общего числа выбранных строк для возврата. По умолчаниюFalse
.
-
method
sqlalchemy.sql.expression.CompoundSelect.
get_execution_options() → _ExecuteOptions¶ наследуется от
Executable.get_execution_options()
методаExecutable
Получить параметры, не относящиеся к SQL, которые будут действовать во время выполнения.
Добавлено в версии 1.3.
См.также
-
method
sqlalchemy.sql.expression.CompoundSelect.
get_label_style() → SelectLabelStyle¶ наследуется от
GenerativeSelect.get_label_style()
методаGenerativeSelect
Получение текущего стиля этикетки.
Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.CompoundSelect.
group_by(_GenerativeSelect__first: Union[Literal[None, _NoArg.NO_ARG], _ColumnExpressionOrStrLabelArgument[Any]] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ наследуется от
GenerativeSelect.group_by()
методаGenerativeSelect
Возвращает новый selectable с заданным списком критериев GROUP BY.
Все существующие настройки GROUP BY могут быть подавлены путем передачи
None
.например:
stmt = select(table.c.name, func.max(table.c.stat)).\ group_by(table.c.name)
- Параметры:
*clauses – серию конструкций
ColumnElement
, которые будут использоваться для создания предложения GROUP BY.
-
method
sqlalchemy.sql.expression.CompoundSelect.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ Возвращает
True
, если данныйReturnsRows
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.CompoundSelect.
label(name: Optional[str]) → Label[Any]¶ наследуется от
SelectBase.label()
методаSelectBase
Возвращает «скалярное» представление этого selectable, встроенное в виде подзапроса с меткой.
См.также
-
method
sqlalchemy.sql.expression.CompoundSelect.
lateral(name: Optional[str] = None) → LateralFromClause¶ наследуется от
SelectBase.lateral()
методаSelectBase
Возвращает ЛАТЕРАЛЬНЫЙ псевдоним данного
Selectable
.Возвращаемым значением является конструкция
Lateral
, также предоставляемая функцией верхнего уровняlateral()
.См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
-
method
sqlalchemy.sql.expression.CompoundSelect.
limit(limit: _LimitOffsetType) → Self¶ наследуется от
GenerativeSelect.limit()
методаGenerativeSelect
Возвращает новый selectable с заданным критерием LIMIT.
Это числовое значение, которое обычно отображается как выражение
LIMIT
в результирующем select. Бэкенды, не поддерживающиеLIMIT
, будут пытаться обеспечить аналогичную функциональность.Примечание
Метод
GenerativeSelect.limit()
заменит любую оговорку, примененную с помощьюGenerativeSelect.fetch()
.- Параметры:
limit – целочисленный параметр LIMIT, или выражение SQL, которое дает целочисленный результат. Передайте
None
, чтобы сбросить его.
-
method
sqlalchemy.sql.expression.CompoundSelect.
offset(offset: _LimitOffsetType) → Self¶ наследуется от
GenerativeSelect.offset()
методаGenerativeSelect
Возвращает новый selectable с заданным критерием OFFSET.
Это числовое значение, которое обычно отображается как выражение
OFFSET
в результирующем select. Бэкенды, не поддерживающиеOFFSET
, будут пытаться обеспечить аналогичную функциональность.- Параметры:
offset – целочисленный параметр OFFSET, или выражение SQL, которое дает целочисленный результат. Передайте
None
, чтобы сбросить его.
-
method
sqlalchemy.sql.expression.CompoundSelect.
options(*options: ExecutableOption) → Self¶ наследуется от
Executable.options()
методаExecutable
Примените варианты к этому утверждению.
В общем смысле опции - это любой вид объекта Python, который может быть интерпретирован компилятором SQL для оператора. Эти опции могут потребляться конкретными диалектами или конкретными видами компиляторов.
Наиболее известным видом опций являются опции уровня ORM, которые применяют «жаждущую загрузку» и другие способы загрузки к запросам ORM. Однако теоретически опции могут использоваться и для многих других целей.
Для получения информации о конкретных видах опций для конкретных видов утверждений, обратитесь к документации для этих объектов опций.
Изменено в версии 1.4: - added
Executable.options()
to Core statement objects towards the goal of allowing unified Core / ORM querying capabilities.См.также
Варианты загрузки колонн - относится к опциям, специфичным для использования ORM-запросов
Загрузка отношений с помощью опций загрузчика - относится к опциям, специфичным для использования ORM-запросов
-
method
sqlalchemy.sql.expression.CompoundSelect.
order_by(_GenerativeSelect__first: Union[Literal[None, _NoArg.NO_ARG], _ColumnExpressionOrStrLabelArgument[Any]] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ наследуется от
GenerativeSelect.order_by()
методаGenerativeSelect
Возвращает новый selectable с заданным списком критериев ORDER BY.
например:
stmt = select(table).order_by(table.c.id, table.c.name)
Вызов этого метода несколько раз эквивалентен вызову его один раз с конкатенацией всех пунктов. Все существующие критерии ORDER BY могут быть отменены, передав
None
сам по себе. Новые критерии ORDER BY могут быть добавлены путем повторного вызоваQuery.order_by()
, например:# will erase all ORDER BY and ORDER BY new_col alone stmt = stmt.order_by(None).order_by(new_col)
- Параметры:
*clauses – серию конструкций
ColumnElement
, которые будут использоваться для создания предложения ORDER BY.
-
method
sqlalchemy.sql.expression.CompoundSelect.
replace_selectable(old: FromClause, alias: Alias) → Self¶ наследуется от
Selectable.replace_selectable()
методаSelectable
Заменяет все вхождения
FromClause
„old“ на данный объектAlias
, возвращая копию этогоFromClause
.Не рекомендуется, начиная с версии 1.4: Метод
Selectable.replace_selectable()
является устаревшим и будет удален в одном из будущих выпусков. Аналогичная функциональность доступна через модуль sqlalchemy.sql.visitors.
-
method
sqlalchemy.sql.expression.CompoundSelect.
scalar_subquery() → ScalarSelect[Any]¶ наследуется от
SelectBase.scalar_subquery()
методаSelectBase
Возвращает «скалярное» представление этого selectable, которое может быть использовано в качестве выражения столбца.
Возвращаемый объект является экземпляром
ScalarSelect
.Как правило, оператор select, имеющий только один столбец в пункте columns, может быть использован в качестве скалярного выражения. Затем скалярный подзапрос можно использовать в пункте WHERE или в пункте columns заключающего оператора SELECT.
Обратите внимание, что скалярный подзапрос отличается от подзапроса уровня FROM, который может быть получен с помощью метода
SelectBase.subquery()
.См.также
Скалярные и коррелированные подзапросы - в учебнике 2.0
-
method
sqlalchemy.sql.expression.CompoundSelect.
select(*arg: Any, **kw: Any) → Select¶ наследуется от
SelectBase.select()
методаSelectBase
Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.select()
является устаревшим и будет удален в будущем выпуске; этот метод неявно создает подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем можно будет выбрать.
-
attribute
sqlalchemy.sql.expression.CompoundSelect.
selected_columns¶ ColumnCollection
, представляющий столбцы, которые данный оператор SELECT или аналогичная конструкция возвращает в свой набор результатов, не включая конструкцииTextClause
.Для
CompoundSelect
атрибутCompoundSelect.selected_columns
возвращает выбранные столбцы первого оператора SELECT, содержащегося в серии операторов в рамках операции set.См.также
Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.CompoundSelect.
self_group(against: Optional[OperatorType] = None) → GroupedElement¶ Примените «группировку» к этому
ClauseElement
.Этот метод переопределяется подклассами для возврата конструкции «группировки», т.е. круглой скобки. В частности, она используется «бинарными» выражениями для обеспечения группировки вокруг себя при помещении в более крупное выражение, а также конструкциями
select()
при помещении в предложение FROM другогоselect()
. (Обратите внимание, что подзапросы обычно следует создавать с помощью методаSelect.alias()
, поскольку многие платформы требуют, чтобы вложенные операторы SELECT были именованными).Поскольку выражения составляются вместе, применение
self_group()
происходит автоматически - код конечного пользователя никогда не должен использовать этот метод напрямую. Обратите внимание, что в конструкциях клаузул SQLAlchemy учитывается приоритет операторов - поэтому скобки могут не понадобиться, например, в выраженииx OR (y AND z)
- AND имеет приоритет над OR.Базовый метод
self_group()
ClauseElement
просто возвращает self.
-
method
sqlalchemy.sql.expression.CompoundSelect.
set_label_style(style: SelectLabelStyle) → CompoundSelect¶ Возвращает новый selectable с указанным стилем метки.
Существует три «стиля этикеток»:
SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY
,SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL
иSelectLabelStyle.LABEL_STYLE_NONE
. По умолчанию используется стильSelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL
.В современной SQLAlchemy, как правило, нет необходимости менять стиль маркировки, поскольку метки на выражение более эффективно используются с помощью метода
ColumnElement.label()
. В прошлых версияхLABEL_STYLE_TABLENAME_PLUS_COL
использовался для однозначного определения одноименных колонок из разных таблиц, псевдонимов или подзапросов; более новыйLABEL_STYLE_DISAMBIGUATE_ONLY
теперь применяет метки только к именам, которые конфликтуют с существующими именами, так что влияние этой маркировки минимально.Разграничение необходимо для того, чтобы при создании подзапроса все выражения столбцов были доступны из данной коллекции
FromClause.c
.Добавлено в версии 1.4: - the
GenerativeSelect.set_label_style()
method replaces the previous combination of.apply_labels()
,.with_labels()
anduse_labels=True
methods and/or parameters.См.также
LABEL_STYLE_DISAMBIGUATE_ONLY
LABEL_STYLE_TABLENAME_PLUS_COL
LABEL_STYLE_NONE
LABEL_STYLE_DEFAULT
-
method
sqlalchemy.sql.expression.CompoundSelect.
slice(start: int, stop: int) → Self¶ наследуется от
GenerativeSelect.slice()
методаGenerativeSelect
Примените LIMIT / OFFSET к этому утверждению на основе среза.
Индексы start и stop ведут себя как аргументы встроенной в Python функции
range()
. Этот метод является альтернативой использованиюLIMIT
/OFFSET
для получения фрагмента запроса.Например,
stmt = select(User).order_by(User).id.slice(1, 3)
отображается как
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
Примечание
Метод
GenerativeSelect.slice()
заменит любую оговорку, примененную с помощьюGenerativeSelect.fetch()
.Добавлено в версии 1.4: Добавлен метод
GenerativeSelect.slice()
, обобщенный из ORM.
-
method
sqlalchemy.sql.expression.CompoundSelect.
subquery(name: Optional[str] = None) → Subquery¶ наследуется от
SelectBase.subquery()
методаSelectBase
Возвращает подзапрос данного
SelectBase
.С точки зрения SQL подзапрос - это именованная конструкция со скобками, которая может быть помещена в предложение FROM другого оператора SELECT.
Учитывая оператор SELECT, такой как:
stmt = select(table.c.id, table.c.name)
Приведенное выше утверждение может выглядеть следующим образом:
SELECT table.id, table.name FROM table
Форма подзапроса сама по себе отображается таким же образом, однако при вставке в предложение FROM другого оператора SELECT она становится именованным подэлементом:
subq = stmt.subquery() new_stmt = select(subq)
Вышеуказанное переводится как:
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
Исторически,
SelectBase.subquery()
эквивалентен вызову методаFromClause.alias()
на объекте FROM; однако, поскольку объектSelectBase
не является непосредственно объектом FROM, методSelectBase.subquery()
обеспечивает более четкую семантику.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.CompoundSelect.
with_for_update(*, nowait: bool = False, read: bool = False, of: Optional[_ForUpdateOfArgument] = None, skip_locked: bool = False, key_share: bool = False) → Self¶ наследуется от
GenerativeSelect.with_for_update()
методаGenerativeSelect
Укажите условие
FOR UPDATE
для этогоGenerativeSelect
.Например:
stmt = select(table).with_for_update(nowait=True)
В базе данных, например, PostgreSQL или Oracle, вышеприведенное выражение будет выглядеть так:
SELECT table.a, table.b FROM table FOR UPDATE NOWAIT
на других бэкендах опция
nowait
игнорируется и вместо нее выдается:SELECT table.a, table.b FROM table FOR UPDATE
При вызове без аргументов утверждение будет отображаться с суффиксом
FOR UPDATE
. Затем могут быть предоставлены дополнительные аргументы, которые позволяют использовать общие варианты, специфичные для базы данных.- Параметры:
nowait – boolean; будет отображать
FOR UPDATE NOWAIT
на диалектах Oracle и PostgreSQL.read – boolean; будет отображать
LOCK IN SHARE MODE
на MySQL,FOR SHARE
на PostgreSQL. На PostgreSQL, в сочетании сnowait
, будет отображатьсяFOR SHARE NOWAIT
.of – SQL-выражение или список элементов SQL-выражения (обычно
Column
объектов или совместимое выражение, для некоторых бэкендов может быть и табличным выражением), которое будет отображаться в предложениеFOR UPDATE OF
; поддерживается PostgreSQL, Oracle, некоторыми версиями MySQL и, возможно, другими. Может отображаться как таблица или как столбец в зависимости от бэкенда.skip_locked – boolean, будет выводить
FOR UPDATE SKIP LOCKED
на диалектах Oracle и PostgreSQL илиFOR SHARE SKIP LOCKED
, если также указаноread=True
.key_share – boolean, будет отображать
FOR NO KEY UPDATE
, или в сочетании сread=True
будет отображатьFOR KEY SHARE
, на диалекте PostgreSQL.
-
method
- class sqlalchemy.sql.expression.CTE¶
Представьте общее табличное выражение.
Объект
CTE
получается с помощью методаSelectBase.cte()
из любого оператора SELECT. Менее часто доступный синтаксис также позволяет использовать методHasCTE.cte()
, присутствующий в конструкциях DML, таких какInsert
,Update
иDelete
. Подробности использования метода для CTE см. в разделе МетодHasCTE.cte()
.Members
Классная подпись
class
sqlalchemy.sql.expression.CTE
(sqlalchemy.sql.roles.DMLTableRole
,sqlalchemy.sql.roles.IsCTERole
,sqlalchemy.sql.expression.Generative
,sqlalchemy.sql.expression.HasPrefixes
,sqlalchemy.sql.expression.HasSuffixes
,sqlalchemy.sql.expression.AliasedReturnsRows
)-
method
sqlalchemy.sql.expression.CTE.
alias(name: Optional[str] = None, flat: bool = False) → CTE¶ -
Этот метод является специфической для CTE специализацией метода
FromClause.alias()
.
-
method
sqlalchemy.sql.expression.CTE.
union(*other: _SelectStatementForCompoundArgument) → CTE¶ Возвращает новый
CTE
с SQLUNION
исходного CTE против заданных selectables, представленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
См.также
HasCTE.cte()
- примеры стилей вызова
-
method
sqlalchemy.sql.expression.CTE.
union_all(*other: _SelectStatementForCompoundArgument) → CTE¶ Возвращает новый
CTE
с SQLUNION ALL
исходного CTE против заданных selectables, представленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
См.также
HasCTE.cte()
- примеры стилей вызова
-
method
- class sqlalchemy.sql.expression.Executable¶
Пометить
ClauseElement
как поддерживающий выполнение.Executable
является суперклассом для всех объектов типа «statement», включаяselect()
,delete()
,update()
,insert()
,text()
.Классная подпись
класс
sqlalchemy.sql.expression.Executable
(sqlalchemy.sql.roles.StatementRole
)-
method
sqlalchemy.sql.expression.Executable.
execution_options(**kw: Any) → Self¶ Установите для оператора параметры, не относящиеся к SQL, которые вступают в силу во время выполнения.
Параметры выполнения могут быть установлены в различных масштабах, в том числе на запрос, на соединение или на выполнение, с помощью таких методов, как
Connection.execution_options()
и параметров, которые принимают словарь параметров, таких какConnection.execute.execution_options
иSession.execute.execution_options
.Основной характеристикой опции выполнения, в отличие от других видов опций, таких как опции загрузчика ORM, является то, что опции выполнения никогда не влияют на скомпилированный SQL запроса, только на то, что влияет на то, как вызывается сам SQL-запрос или как извлекаются результаты. То есть опции выполнения не являются частью того, что учитывается при компиляции SQL, и не считаются частью кэшированного состояния оператора.
Метод
Executable.execution_options()
является generative, как и в случае применения метода к объектамEngine
иQuery
, что означает, что при вызове метода возвращается копия объекта, которая применяет заданные параметры к этой новой копии, но оставляет оригинал неизменным:statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
Исключением из этого поведения является объект
Connection
, где методConnection.execution_options()
явно не генеративный.Типы параметров, которые могут быть переданы в
Executable.execution_options()
и другие связанные методы и словари параметров, включают параметры, которые явно потребляются SQLAlchemy Core или ORM, а также произвольные аргументы ключевых слов, не определенные SQLAlchemy, что означает, что методы и/или словари параметров могут использоваться для определяемых пользователем параметров, которые взаимодействуют с пользовательским кодом, который может обращаться к параметрам с помощью таких методов, какExecutable.get_execution_options()
иConnection.get_execution_options()
, или в рамках выбранных крючков событий с помощью специального параметра событияexecution_options
, такого какConnectionEvents.before_execute.execution_options
илиORMExecuteState.execution_options
, например. g.:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
В рамках опций, которые явно распознаются SQLAlchemy, большинство из них применяются к определенным классам объектов, а не к другим. К наиболее распространенным опциям выполнения относятся:
Connection.execution_options.isolation_level
- устанавливает уровень изоляции для соединения или класса соединений черезEngine
. Этот параметр принимается толькоConnection
илиEngine
.Connection.execution_options.stream_results
- указывает, что результаты должны быть получены с помощью курсора на стороне сервера; эта опция принимаетсяConnection
, параметромConnection.execute.execution_options
наConnection.execute()
, и дополнительноExecutable.execution_options()
на объекте оператора SQL, а также конструкциями ORM, такими какSession.execute()
.Connection.execution_options.compiled_cache
- указывает словарь, который будет служить SQL compilation cache дляConnection
илиEngine
, а также для методов ORM, таких какSession.execute()
. Может быть передан какNone
, чтобы отключить кэширование для утверждений. Эта опция не принимаетсяExecutable.execution_options()
, поскольку нежелательно переносить кэш компиляции внутри объекта statement.Connection.execution_options.schema_translate_map
- отображение имен схем, используемых функцией Schema Translate Map, принимаемых функциямиConnection
,Engine
,Executable
, а также конструкциями ORM, такими какSession.execute()
.
См.также
Connection.execution_options()
Connection.execute.execution_options
Session.execute.execution_options
Варианты выполнения ORM - документация по всем специфическим для ORM опциям исполнения
-
method
sqlalchemy.sql.expression.Executable.
get_execution_options() → _ExecuteOptions¶ Получить параметры, не относящиеся к SQL, которые будут действовать во время выполнения.
Добавлено в версии 1.3.
См.также
-
method
sqlalchemy.sql.expression.Executable.
options(*options: ExecutableOption) → Self¶ Примените варианты к этому утверждению.
В общем смысле опции - это любой вид объекта Python, который может быть интерпретирован компилятором SQL для оператора. Эти опции могут потребляться конкретными диалектами или конкретными видами компиляторов.
Наиболее известным видом опций являются опции уровня ORM, которые применяют «жаждущую загрузку» и другие способы загрузки к запросам ORM. Однако теоретически опции могут использоваться и для многих других целей.
Для получения информации о конкретных видах опций для конкретных видов утверждений, обратитесь к документации для этих объектов опций.
Изменено в версии 1.4: - added
Executable.options()
to Core statement objects towards the goal of allowing unified Core / ORM querying capabilities.См.также
Варианты загрузки колонн - относится к опциям, специфичным для использования ORM-запросов
Загрузка отношений с помощью опций загрузчика - относится к опциям, специфичным для использования ORM-запросов
-
method
- class sqlalchemy.sql.expression.Exists¶
Представляет собой клаузулу
EXISTS
.Описание использования см. в
exists()
.Клаузулу
EXISTS
можно также построить из экземпляраselect()
, вызвавSelectBase.exists()
.Members
correlate(), correlate_except(), inherit_cache, select(), select_from(), where()
Классная подпись
класс
sqlalchemy.sql.expression.Exists
(sqlalchemy.sql.expression.UnaryExpression
)-
method
sqlalchemy.sql.expression.Exists.
correlate(*fromclauses: Union[Literal[None, False], _FromClauseArgument]) → Self¶ Примените корреляцию к подзапросу, отмеченному этим
Exists
.См.также
-
method
sqlalchemy.sql.expression.Exists.
correlate_except(*fromclauses: Union[Literal[None, False], _FromClauseArgument]) → Self¶ Примените корреляцию к подзапросу, отмеченному этим
Exists
.См.также
-
attribute
sqlalchemy.sql.expression.Exists.
inherit_cache: Optional[bool] = True¶ Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
sqlalchemy.sql.expression.Exists.
select() → Select¶ Возвращает SELECT данного
Exists
.например:
stmt = exists(some_table.c.id).where(some_table.c.id == 5).select()
Это приведет к появлению сообщения, напоминающего:
SELECT EXISTS (SELECT id FROM some_table WHERE some_table = :param) AS anon_1
См.также
select()
- метод общего назначения, позволяющий создавать произвольные списки столбцов.
-
method
sqlalchemy.sql.expression.Exists.
select_from(*froms: FromClause) → Self¶ Возвращает новую конструкцию
Exists
, применяющую данное выражение к методуSelect.select_from()
содержащегося оператора select.Примечание
обычно предпочтительнее сначала построить оператор
Select
, включая желаемое предложение WHERE, а затем использовать методSelectBase.exists()
для создания объектаExists
сразу.
-
method
sqlalchemy.sql.expression.Exists.
where(*clause: _ColumnExpressionArgument[bool]) → Self¶ Возвращает новую конструкцию
exists()
с заданным выражением, добавленным к пункту WHERE, присоединенным к существующему пункту через AND, если таковой имеется.Примечание
обычно предпочтительнее сначала построить оператор
Select
, включая желаемое предложение WHERE, а затем использовать методSelectBase.exists()
для создания объектаExists
сразу.
-
method
- class sqlalchemy.sql.expression.FromClause¶
Представляет собой элемент, который может быть использован в пункте
FROM
оператораSELECT
.Наиболее распространенными формами
FromClause
являются конструкцииTable
иselect()
. Ключевые характеристики, общие для всех объектовFromClause
, включают:коллекция
c
, которая обеспечивает доступ по имени к коллекции объектовColumnElement
.атрибут
primary_key
, который представляет собой коллекцию всех тех объектовColumnElement
, которые указывают на флагprimary_key
.Методы генерации различных производных клаузулы «от», включая
FromClause.alias()
,FromClause.join()
,FromClause.select()
.
Members
alias(), c, columns, description, entity_namespace, exported_columns, foreign_keys, is_derived_from(), join(), outerjoin(), primary_key, schema, select(), tablesample()
Классная подпись
класс
sqlalchemy.sql.expression.FromClause
(sqlalchemy.sql.roles.AnonymizedFromClauseRole
,sqlalchemy.sql.expression.Selectable
)-
method
sqlalchemy.sql.expression.FromClause.
alias(name: Optional[str] = None, flat: bool = False) → NamedFromClause¶ Возвращает псевдоним данного
FromClause
.Например:
a2 = some_table.alias('a2')
Приведенный выше код создает объект
Alias
, который можно использовать как предложение FROM в любом операторе SELECT.
-
attribute
sqlalchemy.sql.expression.FromClause.
c¶ Синоним для
FromClause.columns
- Результат:
-
attribute
sqlalchemy.sql.expression.FromClause.
columns¶ Коллекция объектов
ColumnElement
, поддерживаемых даннымFromClause
, основанная на именах.Коллекция
columns
, илиc
, является шлюзом для построения SQL-выражений, использующих столбцы, связанные с таблицей или другими выбираемыми столбцами:select(mytable).where(mytable.c.somecolumn == 5)
- Результат:
объект
ColumnCollection
.
-
attribute
sqlalchemy.sql.expression.FromClause.
description¶ Краткое описание этого
FromClause
.Используется в основном для форматирования сообщений об ошибках.
-
attribute
sqlalchemy.sql.expression.FromClause.
entity_namespace¶ Возвращает пространство имен, используемое для доступа на основе имен в выражениях SQL.
Это пространство имен, которое используется для разрешения выражений типа «filter_by()», таких как:
stmt.filter_by(address='some address')
По умолчанию используется коллекция
.c
, однако внутренне ее можно переопределить с помощью аннотации «entity_namespace» для получения альтернативных результатов.
-
attribute
sqlalchemy.sql.expression.FromClause.
exported_columns¶ ColumnCollection
, который представляет «экспортированные» столбцы данногоSelectable
.«Экспортируемые» столбцы для объекта
FromClause
являются синонимом коллекцииFromClause.columns
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.FromClause.
foreign_keys¶ Возвращает коллекцию объектов маркеров
ForeignKey
, на которые ссылается данный FromClause.Каждый
ForeignKey
является членомTable
широкогоForeignKeyConstraint
.См.также
-
method
sqlalchemy.sql.expression.FromClause.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ Возвращает
True
, если данныйFromClause
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.FromClause.
join(right: _FromClauseArgument, onclause: Optional[_ColumnExpressionArgument[bool]] = None, isouter: bool = False, full: bool = False) → Join¶ Возвращает
Join
из данногоFromClause
в другойFromClause
.Например:
from sqlalchemy import join j = user_table.join(address_table, user_table.c.id == address_table.c.user_id) stmt = select(user_table).select_from(j)
будет выдавать SQL примерно следующего содержания:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
- Параметры:
right – правая сторона соединения; это любой объект
FromClause
, например, объектTable
, а также может быть совместимым с selectable объектом, например, ORM-mapped class.onclause – выражение SQL, представляющее предложение ON для объединения. Если оставить значение
None
,FromClause.join()
попытается объединить две таблицы на основе отношения внешнего ключа.isouter – если True, отображает LEFT OUTER JOIN вместо JOIN.
full – если True, отображает FULL OUTER JOIN, вместо LEFT OUTER JOIN. Подразумевает
FromClause.join.isouter
.
-
method
sqlalchemy.sql.expression.FromClause.
outerjoin(right: _FromClauseArgument, onclause: Optional[_ColumnExpressionArgument[bool]] = None, full: bool = False) → Join¶ Возвращает
Join
из данногоFromClause
в другойFromClause
, с флагом «isouter», установленным в True.Например:
from sqlalchemy import outerjoin j = user_table.outerjoin(address_table, user_table.c.id == address_table.c.user_id)
Вышесказанное эквивалентно:
j = user_table.join( address_table, user_table.c.id == address_table.c.user_id, isouter=True)
- Параметры:
right – правая сторона соединения; это любой объект
FromClause
, например, объектTable
, а также может быть совместимым с selectable объектом, например, ORM-mapped class.onclause – выражение SQL, представляющее предложение ON для объединения. Если оставить значение
None
,FromClause.join()
попытается объединить две таблицы на основе отношения внешнего ключа.full – если True, отображает ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ.
-
attribute
sqlalchemy.sql.expression.FromClause.
primary_key¶ Возвращает итерируемую коллекцию объектов
Column
, составляющих первичный ключ данного_selectable.FromClause
.Для объекта
Table
эта коллекция представлена объектомPrimaryKeyConstraint
, который сам является итерируемой коллекцией объектовColumn
.
-
attribute
sqlalchemy.sql.expression.FromClause.
schema: Optional[str] = None¶ Определите атрибут „schema“ для данного
FromClause
.Обычно это
None
для большинства объектов, за исключениемTable
, где оно принимается как значение аргументаTable.schema
.
-
method
sqlalchemy.sql.expression.FromClause.
select() → Select¶ Возвращает SELECT данного
FromClause
.например:
stmt = some_table.select().where(some_table.c.id == 5)
См.также
select()
- метод общего назначения, позволяющий создавать произвольные списки столбцов.
-
method
sqlalchemy.sql.expression.FromClause.
tablesample(sampling: Union[float, Function[Any]], name: Optional[str] = None, seed: Optional[roles.ExpressionElementRole[Any]] = None) → TableSample¶ Возвращает псевдоним TABLESAMPLE данного
FromClause
.Возвращаемым значением является конструкция
TableSample
, также предоставляемая функцией верхнего уровняtablesample()
.См.также
tablesample()
- руководство по использованию и параметры
- class sqlalchemy.sql.expression.GenerativeSelect¶
Базовый класс для операторов SELECT, в который могут быть добавлены дополнительные элементы.
Это служит основой для
Select
иCompoundSelect
, где можно добавлять такие элементы, как ORDER BY, GROUP BY и управлять отображением столбцов. Сравните сTextualSelect
, который, хотя и является подклассомSelectBase
и конструкцией SELECT, представляет собой фиксированную текстовую строку, которая не может быть изменена на этом уровне, а только обернута как подзапрос.Members
fetch(), get_label_style(), group_by(), limit(), offset(), order_by(), set_label_style(), slice(), with_for_update()
Классная подпись
класс
sqlalchemy.sql.expression.GenerativeSelect
(sqlalchemy.sql.expression.SelectBase
,sqlalchemy.sql.expression.Generative
)-
method
sqlalchemy.sql.expression.GenerativeSelect.
fetch(count: _LimitOffsetType, with_ties: bool = False, percent: bool = False) → Self¶ Возвращает новый selectable с заданным критерием FETCH FIRST.
Это числовое значение, которое обычно отображается как выражение
FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}
в результирующем select. Эта функциональность в настоящее время реализована для Oracle, PostgreSQL, MSSQL.Используйте
GenerativeSelect.offset()
для указания смещения.Примечание
Метод
GenerativeSelect.fetch()
заменит любую оговорку, примененную с помощьюGenerativeSelect.limit()
.Добавлено в версии 1.4.
- Параметры:
count – целочисленный параметр COUNT или выражение SQL, которое дает целочисленный результат. При
percent=True
это значение будет представлять процент возвращаемых строк, а не абсолютное значение. ПередайтеNone
, чтобы сбросить его.with_ties – Когда
True
, опция WITH TIES используется для возврата всех дополнительных строк, которые занимают последнее место в наборе результатов в соответствии с предложениемORDER BY
. ПараметрORDER BY
может быть обязательным в этом случае. По умолчанию используетсяFalse
.percent – Когда
True
,count
представляет собой процент от общего числа выбранных строк для возврата. По умолчаниюFalse
.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
get_label_style() → SelectLabelStyle¶ Получение текущего стиля этикетки.
Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
group_by(_GenerativeSelect__first: Union[Literal[None, _NoArg.NO_ARG], _ColumnExpressionOrStrLabelArgument[Any]] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ Возвращает новый selectable с заданным списком критериев GROUP BY.
Все существующие настройки GROUP BY могут быть подавлены путем передачи
None
.например:
stmt = select(table.c.name, func.max(table.c.stat)).\ group_by(table.c.name)
- Параметры:
*clauses – серию конструкций
ColumnElement
, которые будут использоваться для создания предложения GROUP BY.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
limit(limit: _LimitOffsetType) → Self¶ Возвращает новый selectable с заданным критерием LIMIT.
Это числовое значение, которое обычно отображается как выражение
LIMIT
в результирующем select. Бэкенды, не поддерживающиеLIMIT
, будут пытаться обеспечить аналогичную функциональность.Примечание
Метод
GenerativeSelect.limit()
заменит любую оговорку, примененную с помощьюGenerativeSelect.fetch()
.- Параметры:
limit – целочисленный параметр LIMIT, или выражение SQL, которое дает целочисленный результат. Передайте
None
, чтобы сбросить его.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
offset(offset: _LimitOffsetType) → Self¶ Возвращает новый selectable с заданным критерием OFFSET.
Это числовое значение, которое обычно отображается как выражение
OFFSET
в результирующем select. Бэкенды, не поддерживающиеOFFSET
, будут пытаться обеспечить аналогичную функциональность.- Параметры:
offset – целочисленный параметр OFFSET, или выражение SQL, которое дает целочисленный результат. Передайте
None
, чтобы сбросить его.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
order_by(_GenerativeSelect__first: Union[Literal[None, _NoArg.NO_ARG], _ColumnExpressionOrStrLabelArgument[Any]] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ Возвращает новый selectable с заданным списком критериев ORDER BY.
например:
stmt = select(table).order_by(table.c.id, table.c.name)
Вызов этого метода несколько раз эквивалентен вызову его один раз с конкатенацией всех пунктов. Все существующие критерии ORDER BY могут быть отменены, передав
None
сам по себе. Новые критерии ORDER BY могут быть добавлены путем повторного вызоваQuery.order_by()
, например:# will erase all ORDER BY and ORDER BY new_col alone stmt = stmt.order_by(None).order_by(new_col)
- Параметры:
*clauses – серию конструкций
ColumnElement
, которые будут использоваться для создания предложения ORDER BY.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
set_label_style(style: SelectLabelStyle) → Self¶ Возвращает новый selectable с указанным стилем метки.
Существует три «стиля этикеток»:
SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY
,SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL
иSelectLabelStyle.LABEL_STYLE_NONE
. По умолчанию используется стильSelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL
.В современной SQLAlchemy, как правило, нет необходимости менять стиль маркировки, поскольку метки на выражение более эффективно используются с помощью метода
ColumnElement.label()
. В прошлых версияхLABEL_STYLE_TABLENAME_PLUS_COL
использовался для однозначного определения одноименных колонок из разных таблиц, псевдонимов или подзапросов; более новыйLABEL_STYLE_DISAMBIGUATE_ONLY
теперь применяет метки только к именам, которые конфликтуют с существующими именами, так что влияние этой маркировки минимально.Разграничение необходимо для того, чтобы при создании подзапроса все выражения столбцов были доступны из данной коллекции
FromClause.c
.Добавлено в версии 1.4: - the
GenerativeSelect.set_label_style()
method replaces the previous combination of.apply_labels()
,.with_labels()
anduse_labels=True
methods and/or parameters.См.также
LABEL_STYLE_DISAMBIGUATE_ONLY
LABEL_STYLE_TABLENAME_PLUS_COL
LABEL_STYLE_NONE
LABEL_STYLE_DEFAULT
-
method
sqlalchemy.sql.expression.GenerativeSelect.
slice(start: int, stop: int) → Self¶ Примените LIMIT / OFFSET к этому утверждению на основе среза.
Индексы start и stop ведут себя как аргументы встроенной в Python функции
range()
. Этот метод является альтернативой использованиюLIMIT
/OFFSET
для получения фрагмента запроса.Например,
stmt = select(User).order_by(User).id.slice(1, 3)
отображается как
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
Примечание
Метод
GenerativeSelect.slice()
заменит любую оговорку, примененную с помощьюGenerativeSelect.fetch()
.Добавлено в версии 1.4: Добавлен метод
GenerativeSelect.slice()
, обобщенный из ORM.
-
method
sqlalchemy.sql.expression.GenerativeSelect.
with_for_update(*, nowait: bool = False, read: bool = False, of: Optional[_ForUpdateOfArgument] = None, skip_locked: bool = False, key_share: bool = False) → Self¶ Укажите условие
FOR UPDATE
для этогоGenerativeSelect
.Например:
stmt = select(table).with_for_update(nowait=True)
В базе данных, например, PostgreSQL или Oracle, вышеприведенное выражение будет выглядеть так:
SELECT table.a, table.b FROM table FOR UPDATE NOWAIT
на других бэкендах опция
nowait
игнорируется и вместо нее выдается:SELECT table.a, table.b FROM table FOR UPDATE
При вызове без аргументов утверждение будет отображаться с суффиксом
FOR UPDATE
. Затем могут быть предоставлены дополнительные аргументы, которые позволяют использовать общие варианты, специфичные для базы данных.- Параметры:
nowait – boolean; будет отображать
FOR UPDATE NOWAIT
на диалектах Oracle и PostgreSQL.read – boolean; будет отображать
LOCK IN SHARE MODE
на MySQL,FOR SHARE
на PostgreSQL. На PostgreSQL, в сочетании сnowait
, будет отображатьсяFOR SHARE NOWAIT
.of – SQL-выражение или список элементов SQL-выражения (обычно
Column
объектов или совместимое выражение, для некоторых бэкендов может быть и табличным выражением), которое будет отображаться в предложениеFOR UPDATE OF
; поддерживается PostgreSQL, Oracle, некоторыми версиями MySQL и, возможно, другими. Может отображаться как таблица или как столбец в зависимости от бэкенда.skip_locked – boolean, будет выводить
FOR UPDATE SKIP LOCKED
на диалектах Oracle и PostgreSQL илиFOR SHARE SKIP LOCKED
, если также указаноread=True
.key_share – boolean, будет отображать
FOR NO KEY UPDATE
, или в сочетании сread=True
будет отображатьFOR KEY SHARE
, на диалекте PostgreSQL.
-
method
- class sqlalchemy.sql.expression.HasCTE¶
Миксин, который объявляет класс для включения поддержки CTE.
Классная подпись
класс
sqlalchemy.sql.expression.HasCTE
(sqlalchemy.sql.roles.HasCTERole
,sqlalchemy.sql.expression.SelectsRows
)-
method
sqlalchemy.sql.expression.HasCTE.
add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ Добавьте к этому утверждению одну или несколько конструкций
CTE
.Этот метод свяжет заданные конструкции
CTE
с родительским оператором таким образом, что каждая из них будет безоговорочно отображена в предложение WITH конечного оператора, даже если на нее нет ссылок в других местах оператора или вложенных селектов.Необязательный параметр
HasCTE.add_cte.nest_here
при установке в True будет иметь тот эффект, что каждый данныйCTE
будет отображаться в предложении WITH, отображаемом непосредственно вместе с этим утверждением, а не перемещаться в начало конечного отображаемого утверждения, даже если это утверждение отображается как подзапрос внутри более крупного утверждения.Этот метод имеет два общих применения. Первое - это встраивание операторов CTE, которые служат некоторым целям без явных ссылок, например, в случае встраивания оператора DML, такого как INSERT или UPDATE, в качестве CTE в линию с основным оператором, который может косвенно использовать его результаты. Другая задача - обеспечить контроль над точным размещением определенной серии конструкций CTE, которые должны оставаться отображенными непосредственно в терминах конкретного оператора, который может быть вложен в более крупный оператор.
Например:
from sqlalchemy import table, column, select t = table('t', column('c1'), column('c2')) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
Будет оказывать:
WITH anon_1 AS (INSERT INTO t (c1, c2) VALUES (:param_1, :param_2)) SELECT t.c1, t.c2 FROM t
Выше, CTE «anon_1» не упоминается в операторе SELECT, но все же выполняет задачу запуска оператора INSERT.
Аналогично в контексте, связанном с DML, использование конструкции PostgreSQL
Insert
для создания «upsert»:from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = ( t.delete().where(t.c.c1 < 1).cte("deletions") ) insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
Вышеприведенное утверждение выглядит следующим образом:
WITH deletions AS (DELETE FROM t WHERE t.c1 < %(c1_1)s) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
Добавлено в версии 1.4.21.
- Параметры:
*ctes – ноль или более конструкций
CTE
. … versionchanged:: 2.0 Принимаются несколько экземпляров CTEnest_here – если True, то данный CTE или CTE будут отображаться так, как если бы при добавлении их в данный
HasCTE
был указан флагHasCTE.cte.nesting
вTrue
. Если предполагается, что на данные CTE не ссылаются во внешнем охватывающем утверждении, то при установке этого флага данные CTE будут отображаться на уровне этого утверждения. … версия добавлена:: 2.0 .. seealso::HasCTE.cte.nesting
-
method
sqlalchemy.sql.expression.HasCTE.
cte(name: Optional[str] = None, recursive: bool = False, nesting: bool = False) → CTE¶ Возвращает новый экземпляр
CTE
, или Common Table Expression.Общие табличные выражения - это стандарт SQL, согласно которому операторы SELECT могут использовать вторичные операторы, указанные вместе с первичным оператором, используя предложение под названием «WITH». Специальная семантика UNION также может быть использована для обеспечения «рекурсивных» запросов, когда оператор SELECT может использовать набор строк, которые были выбраны ранее.
CTE также могут применяться к конструкциям DML UPDATE, INSERT и DELETE в некоторых базах данных, как в качестве источника строк CTE в сочетании с RETURNING, так и в качестве потребителя строк CTE.
SQLAlchemy определяет объекты
CTE
, которые рассматриваются аналогично объектамAlias
, как специальные элементы, которые должны быть доставлены в предложение FROM оператора, а также в предложение WITH в верхней части оператора.Для специальных префиксов, таких как PostgreSQL «MATERIALIZED» и «NOT MATERIALIZED», можно использовать метод
CTE.prefix_with()
для их установления.Изменено в версии 1.3.13: Добавлена поддержка префиксов. В частности - МАТЕРИАЛИЗОВАННЫЙ и НЕ МАТЕРИАЛИЗОВАННЫЙ.
- Параметры:
name – имя, присваиваемое общему табличному выражению. Как и
FromClause.alias()
, имя может быть оставлено какNone
, в этом случае во время компиляции запроса будет использоваться анонимный символ.recursive – если
True
, будет отображатьсяWITH RECURSIVE
. Рекурсивное выражение общей таблицы предназначено для использования в сочетании с UNION ALL, чтобы вывести строки из уже выбранных.nesting – если
True
, то CTE будет отображаться локально в операторе, в котором на него ссылаются. Для более сложных сценариев можно также использовать методHasCTE.add_cte()
с параметромHasCTE.add_cte.nest_here
для более тщательного контроля точного размещения конкретного CTE. … версия добавлена:: 1.4.24 .. seealso::HasCTE.add_cte()
Ниже приведены два примера из документации PostgreSQL по адресу https://www.postgresql.org/docs/current/static/queries-with.html, а также дополнительные примеры.
Пример 1, нерекурсивный:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() orders = Table('orders', metadata, Column('region', String), Column('amount', Integer), Column('product', String), Column('quantity', Integer) ) regional_sales = select( orders.c.region, func.sum(orders.c.amount).label('total_sales') ).group_by(orders.c.region).cte("regional_sales") top_regions = select(regional_sales.c.region).\ where( regional_sales.c.total_sales > select( func.sum(regional_sales.c.total_sales) / 10 ) ).cte("top_regions") statement = select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales") ).where(orders.c.region.in_( select(top_regions.c.region) )).group_by(orders.c.region, orders.c.product) result = conn.execute(statement).fetchall()
Пример 2, С РЕКУРСИВНЫМ:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() parts = Table('parts', metadata, Column('part', String), Column('sub_part', String), Column('quantity', Integer), ) included_parts = select(\ parts.c.sub_part, parts.c.part, parts.c.quantity\ ).\ where(parts.c.part=='our part').\ cte(recursive=True) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).\ where(parts_alias.c.part==incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity). label('total_quantity') ).\ group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
Пример 3, апсерт с использованием UPDATE и INSERT с CTE:
from datetime import date from sqlalchemy import (MetaData, Table, Column, Integer, Date, select, literal, and_, exists) metadata = MetaData() visitors = Table('visitors', metadata, Column('product_id', Integer, primary_key=True), Column('date', Date, primary_key=True), Column('count', Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where(and_(visitors.c.product_id == product_id, visitors.c.date == day)) .values(count=visitors.c.count + count) .returning(literal(1)) .cte('update_cte') ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)) .where(~exists(update_cte.select())) ) connection.execute(upsert)
Пример 4, Вложение CTE (SQLAlchemy 1.4.24 и выше):
value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a", nesting=True) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Приведенный выше запрос выведет второй CTE, вложенный в первый, показанный с инлайн-параметрами ниже как:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
Тот же CTE можно настроить с помощью метода
HasCTE.add_cte()
следующим образом (SQLAlchemy 2.0 и выше):value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n). add_cte(value_a_nested, nest_here=True). cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Пример 5, нелинейный CTE (SQLAlchemy 1.4.28 и выше):
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte( "nodes", recursive=True ) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
Приведенный выше запрос выведет 2 UNION внутри рекурсивного CTE:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
См.также
Query.cte()
- ORM-версияHasCTE.cte()
.
-
method
- class sqlalchemy.sql.expression.HasPrefixes¶
Members
-
method
sqlalchemy.sql.expression.HasPrefixes.
prefix_with(*prefixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ Добавьте одно или несколько выражений после ключевого слова statement, т.е. SELECT, INSERT, UPDATE или DELETE. Генеративный.
Используется для поддержки префиксных ключевых слов, специфичных для бэкенда, таких как те, которые предоставляет MySQL.
Например:
stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") # MySQL 5.7 optimizer hints stmt = select(table).prefix_with( "/*+ BKA(t1) */", dialect="mysql")
Несколько префиксов могут быть заданы несколькими вызовами
HasPrefixes.prefix_with()
.- Параметры:
*prefixes – текстовая или
ClauseElement
конструкция, которая будет отображаться после ключевого слова INSERT, UPDATE или DELETE.dialect – необязательное строковое имя диалекта, которое ограничит отображение этого префикса только этим диалектом.
-
method
- class sqlalchemy.sql.expression.HasSuffixes¶
Members
-
method
sqlalchemy.sql.expression.HasSuffixes.
suffix_with(*suffixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ Добавьте одно или несколько выражений, следующих за высказыванием в целом.
Это используется для поддержки специфических для бэкенда суффиксных ключевых слов в определенных конструкциях.
Например:
stmt = select(col1, col2).cte().suffix_with( "cycle empno set y_cycle to 1 default 0", dialect="oracle")
Несколько суффиксов могут быть заданы несколькими вызовами
HasSuffixes.suffix_with()
.- Параметры:
*suffixes – текстовая или
ClauseElement
конструкция, которая будет выведена после целевой клаузы.dialect – Необязательное строковое имя диалекта, которое ограничит отображение этого суффикса только этим диалектом.
-
method
- class sqlalchemy.sql.expression.Join¶
Представляет собой конструкцию
JOIN
между двумя элементамиFromClause
.Публичной функцией-конструктором для
Join
является функцияjoin()
на уровне модуля, а также методFromClause.join()
любогоFromClause
(например, такого какTable
).Members
__init__(), description, is_derived_from(), select(), self_group()
Классная подпись
класс
sqlalchemy.sql.expression.Join
(sqlalchemy.sql.roles.DMLTableRole
,sqlalchemy.sql.expression.FromClause
)-
method
sqlalchemy.sql.expression.Join.
__init__(left: _FromClauseArgument, right: _FromClauseArgument, onclause: Optional[_OnClauseArgument] = None, isouter: bool = False, full: bool = False)¶ Создайте новый
Join
.Обычной точкой входа здесь является функция
join()
или методFromClause.join()
любого объектаFromClause
.
-
attribute
sqlalchemy.sql.expression.Join.
description¶
-
method
sqlalchemy.sql.expression.Join.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ Возвращает
True
, если данныйFromClause
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.Join.
select() → Select¶ Создайте
Select
из этогоJoin
.Например:
stmt = table_a.join(table_b, table_a.c.id == table_b.c.a_id) stmt = stmt.select()
Вышеприведенные действия дадут SQL-строку, похожую на:
SELECT table_a.id, table_a.col, table_b.id, table_b.a_id FROM table_a JOIN table_b ON table_a.id = table_b.a_id
-
method
sqlalchemy.sql.expression.Join.
self_group(against: Optional[OperatorType] = None) → FromGrouping¶ Примените «группировку» к этому
ClauseElement
.Этот метод переопределяется подклассами для возврата конструкции «группировки», т.е. круглой скобки. В частности, она используется «бинарными» выражениями для обеспечения группировки вокруг себя при помещении в более крупное выражение, а также конструкциями
select()
при помещении в предложение FROM другогоselect()
. (Обратите внимание, что подзапросы обычно следует создавать с помощью методаSelect.alias()
, поскольку многие платформы требуют, чтобы вложенные операторы SELECT были именованными).Поскольку выражения составляются вместе, применение
self_group()
происходит автоматически - код конечного пользователя никогда не должен использовать этот метод напрямую. Обратите внимание, что в конструкциях клаузул SQLAlchemy учитывается приоритет операторов - поэтому скобки могут не понадобиться, например, в выраженииx OR (y AND z)
- AND имеет приоритет над OR.Базовый метод
self_group()
ClauseElement
просто возвращает self.
-
method
- class sqlalchemy.sql.expression.Lateral¶
Представляет собой ЛАТЕРАЛЬНЫЙ подзапрос.
Этот объект строится из функции уровня модуля
lateral()
, а также методаFromClause.lateral()
, доступного для всех подклассовFromClause
.Хотя LATERAL является частью стандарта SQL, в настоящее время только последние версии PostgreSQL обеспечивают поддержку этого ключевого слова.
См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
Members
Классная подпись
класс
sqlalchemy.sql.expression.Lateral
(sqlalchemy.sql.expression.FromClauseAlias
,sqlalchemy.sql.expression.LateralFromClause
)-
attribute
sqlalchemy.sql.expression.Lateral.
inherit_cache: Optional[bool] = True¶ Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
attribute
- class sqlalchemy.sql.expression.ReturnsRows¶
Самый базовый класс для конструкций Core, которые имеют некоторую концепцию столбцов, которые могут представлять строки.
Хотя операторы SELECT и TABLE - это основные вещи, которые мы относим к этой категории, DML, такие как INSERT, UPDATE и DELETE, также могут указывать RETURNING, что означает, что они могут быть использованы в CTE и других формах, а PostgreSQL имеет функции, которые также возвращают строки.
Добавлено в версии 1.4.
Members
Классная подпись
класс
sqlalchemy.sql.expression.ReturnsRows
(sqlalchemy.sql.roles.ReturnsRowsRole
,sqlalchemy.sql.expression.DQLDMLClauseElement
)-
attribute
sqlalchemy.sql.expression.ReturnsRows.
exported_columns¶ ColumnCollection
, который представляет «экспортированные» столбцы данногоReturnsRows
.Экспортируемые» столбцы представляют собой набор выражений
ColumnElement
, которые отображаются этой конструкцией SQL. Существуют первичные разновидности, которые являются «столбцами предложения FROM» в предложении FROM, таком как таблица, объединение или подзапрос, «выбираемые столбцы», которые являются столбцами в предложении «столбцы» оператора SELECT, и столбцы RETURNING в операторе DML…Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.ReturnsRows.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ Возвращает
True
, если данныйReturnsRows
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
attribute
- class sqlalchemy.sql.expression.ScalarSelect¶
Представляет собой скалярный подзапрос.
Объект
ScalarSelect
создается путем вызова методаSelectBase.scalar_subquery()
. Затем этот объект участвует в других выражениях SQL в качестве выражения столбца SQL в иерархииColumnElement
.Members
correlate(), correlate_except(), inherit_cache, self_group(), where()
Классная подпись
class
sqlalchemy.sql.expression.ScalarSelect
(sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.expression.Generative
,sqlalchemy.sql.expression.GroupedElement
,sqlalchemy.sql.expression.ColumnElement
)-
method
sqlalchemy.sql.expression.ScalarSelect.
correlate(*fromclauses: Union[Literal[None, False], _FromClauseArgument]) → Self¶ Возвращает новый
ScalarSelect
, который будет соотносить заданные условия FROM с условиями вложенногоSelect
.Этот метод зеркально отражает метод
Select.correlate()
базовогоSelect
. Метод применяет :meth:_sql.Select.correlate` method, then returns a newScalarSelect
к данному утверждению.Добавлено в версии 1.4: Ранее метод
ScalarSelect.correlate()
был доступен только изSelect
.- Параметры:
*fromclauses – список одной или нескольких конструкций
FromClause
или других совместимых конструкций (т.е. ORM-mapped classes), которые должны стать частью коллекции коррелятов.
-
method
sqlalchemy.sql.expression.ScalarSelect.
correlate_except(*fromclauses: Union[Literal[None, False], _FromClauseArgument]) → Self¶ Возвращает новый
ScalarSelect
, который будет опускать заданные предложения FROM из процесса автокорреляции.Этот метод зеркально отражает метод
Select.correlate_except()
базовогоSelect
. Метод применяет :meth:_sql.Select.correlate_except` method, then returns a newScalarSelect
к этому утверждению.Добавлено в версии 1.4: Ранее метод
ScalarSelect.correlate_except()
был доступен только изSelect
.- Параметры:
*fromclauses – список одной или нескольких конструкций
FromClause
или других совместимых конструкций (т.е. ORM-mapped classes), которые должны стать частью коллекции correlate-exception.
-
attribute
sqlalchemy.sql.expression.ScalarSelect.
inherit_cache: Optional[bool] = True¶ Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
sqlalchemy.sql.expression.ScalarSelect.
self_group(against: Optional[OperatorType] = None) → ColumnElement[Any]¶ Примените «группировку» к этому
ClauseElement
.Этот метод переопределяется подклассами для возврата конструкции «группировки», т.е. круглой скобки. В частности, она используется «бинарными» выражениями для обеспечения группировки вокруг себя при помещении в более крупное выражение, а также конструкциями
select()
при помещении в предложение FROM другогоselect()
. (Обратите внимание, что подзапросы обычно следует создавать с помощью методаSelect.alias()
, поскольку многие платформы требуют, чтобы вложенные операторы SELECT были именованными).Поскольку выражения составляются вместе, применение
self_group()
происходит автоматически - код конечного пользователя никогда не должен использовать этот метод напрямую. Обратите внимание, что в конструкциях клаузул SQLAlchemy учитывается приоритет операторов - поэтому скобки могут не понадобиться, например, в выраженииx OR (y AND z)
- AND имеет приоритет над OR.Базовый метод
self_group()
ClauseElement
просто возвращает self.
-
method
sqlalchemy.sql.expression.ScalarSelect.
where(crit: _ColumnExpressionArgument[bool]) → Self¶ Примените предложение WHERE к оператору SELECT, на который ссылается этот
ScalarSelect
.
-
method
- class sqlalchemy.sql.expression.Select¶
Представляет собой оператор
SELECT
.Объект
Select
обычно строится с помощью функцииselect()
. Подробности см. в этой функции.Members
__init__(), add_columns(), add_cte(), alias(), as_scalar(), c, column(), column_descriptions, columns_clause_froms, correlate(), correlate_except(), corresponding_column(), cte(), distinct(), except_(), except_all(), execution_options(), exists(), exported_columns, fetch(), filter(), filter_by(), from_statement(), froms, get_children(), get_execution_options(), get_final_froms(), get_label_style(), group_by(), having(), inherit_cache, inner_columns, intersect(), intersect_all(), is_derived_from(), join(), join_from(), label(), lateral(), limit(), offset(), options(), order_by(), outerjoin(), outerjoin_from(), prefix_with(), reduce_columns(), replace_selectable(), scalar_subquery(), select(), select_from(), selected_columns, self_group(), set_label_style(), slice(), subquery(), suffix_with(), union(), union_all(), where(), whereclause, with_for_update(), with_hint(), with_only_columns(), with_statement_hint()
Классная подпись
class
sqlalchemy.sql.expression.Select
(sqlalchemy.sql.expression.HasPrefixes
,sqlalchemy.sql.expression.HasSuffixes
,sqlalchemy.sql.expression.HasHints
,sqlalchemy.sql.expression.HasCompileState
,sqlalchemy.sql.expression._SelectFromElements
,sqlalchemy.sql.expression.GenerativeSelect
,sqlalchemy.sql.expression.TypedReturnsRows
)-
method
sqlalchemy.sql.expression.Select.
__init__(*entities: _ColumnsClauseArgument[Any])¶ Создайте новый
Select
.Публичным конструктором для
Select
является функцияselect()
.
-
method
sqlalchemy.sql.expression.Select.
add_columns(*entities: _ColumnsClauseArgument[Any]) → Select[Any]¶ Возвращает новую конструкцию
select()
с заданными сущностями, добавленными к ее предложению columns.Например:
my_select = my_select.add_columns(table.c.new_column)
Исходные выражения в предложении columns остаются на месте. Чтобы заменить исходные выражения новыми, см. метод
Select.with_only_columns()
.- Параметры:
*entities – выражения столбцов, таблиц или других сущностей, которые должны быть добавлены в предложение columns
См.также
Select.with_only_columns()
- заменяет существующие выражения, а не добавляет их.Одновременный выбор нескольких сущностей ORM - пример, ориентированный на ORM
-
method
sqlalchemy.sql.expression.Select.
add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ наследуется от
HasCTE.add_cte()
методаHasCTE
Добавьте к этому утверждению одну или несколько конструкций
CTE
.Этот метод свяжет заданные конструкции
CTE
с родительским оператором таким образом, что каждая из них будет безоговорочно отображена в предложение WITH конечного оператора, даже если на нее нет ссылок в других местах оператора или вложенных селектов.Необязательный параметр
HasCTE.add_cte.nest_here
при установке в True будет иметь тот эффект, что каждый данныйCTE
будет отображаться в предложении WITH, отображаемом непосредственно вместе с этим утверждением, а не перемещаться в начало конечного отображаемого утверждения, даже если это утверждение отображается как подзапрос внутри более крупного утверждения.Этот метод имеет два общих применения. Первое - это встраивание операторов CTE, которые служат некоторым целям без явных ссылок, например, в случае встраивания оператора DML, такого как INSERT или UPDATE, в качестве CTE в линию с основным оператором, который может косвенно использовать его результаты. Другая задача - обеспечить контроль над точным размещением определенной серии конструкций CTE, которые должны оставаться отображенными непосредственно в терминах конкретного оператора, который может быть вложен в более крупный оператор.
Например:
from sqlalchemy import table, column, select t = table('t', column('c1'), column('c2')) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
Будет оказывать:
WITH anon_1 AS (INSERT INTO t (c1, c2) VALUES (:param_1, :param_2)) SELECT t.c1, t.c2 FROM t
Выше, CTE «anon_1» не упоминается в операторе SELECT, но все же выполняет задачу запуска оператора INSERT.
Аналогично в контексте, связанном с DML, использование конструкции PostgreSQL
Insert
для создания «upsert»:from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = ( t.delete().where(t.c.c1 < 1).cte("deletions") ) insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
Вышеприведенное утверждение выглядит следующим образом:
WITH deletions AS (DELETE FROM t WHERE t.c1 < %(c1_1)s) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
Добавлено в версии 1.4.21.
- Параметры:
*ctes – ноль или более конструкций
CTE
. … versionchanged:: 2.0 Принимаются несколько экземпляров CTEnest_here – если True, то данный CTE или CTE будут отображаться так, как если бы при добавлении их в данный
HasCTE
был указан флагHasCTE.cte.nesting
вTrue
. Если предполагается, что на данные CTE не ссылаются во внешнем охватывающем утверждении, то при установке этого флага данные CTE будут отображаться на уровне этого утверждения. … версия добавлена:: 2.0 .. seealso::HasCTE.cte.nesting
-
method
sqlalchemy.sql.expression.Select.
alias(name: Optional[str] = None, flat: bool = False) → Subquery¶ наследуется от
SelectBase.alias()
методаSelectBase
Возвращает именованный подзапрос к данному
SelectBase
.Для
SelectBase
(в отличие отFromClause
) это возвращает объектSubquery
, который ведет себя в основном так же, как объектAlias
, который используется сFromClause
.Изменено в версии 1.4: Метод
SelectBase.alias()
теперь является синонимом методаSelectBase.subquery()
.
-
method
sqlalchemy.sql.expression.Select.
as_scalar() → ScalarSelect[Any]¶ наследуется от
SelectBase.as_scalar()
методаSelectBase
Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.as_scalar()
является устаревшим и будет удален в одном из будущих выпусков. Пожалуйста, обратитесь кSelectBase.scalar_subquery()
.
-
attribute
sqlalchemy.sql.expression.Select.
c¶ наследуется от
SelectBase.c
атрибутаSelectBase
Не рекомендуется, начиная с версии 1.4: Атрибуты
SelectBase.c
иSelectBase.columns
устарели и будут удалены в будущем релизе; эти атрибуты неявно создают подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем будет содержать этот атрибут. Для доступа к столбцам, из которых выбирает данный объект SELECT, используйте атрибутSelectBase.selected_columns
.
-
method
sqlalchemy.sql.expression.Select.
column(column: _ColumnsClauseArgument[Any]) → Select[Any]¶ Возвращает новую конструкцию
select()
с заданным выражением столбца, добавленным к его пункту columns.Не рекомендуется, начиная с версии 1.4: Метод
Select.column()
является устаревшим и будет удален в будущем выпуске. Пожалуйста, используйтеSelect.add_columns()
Например:
my_select = my_select.column(table.c.new_column)
Рекомендации по добавлению/замене столбцов объекта
Select.with_only_columns()
см. в документации поSelect
.
-
attribute
sqlalchemy.sql.expression.Select.
column_descriptions¶ Возвращает структуру plugin-enabled „описания столбцов“, относящуюся к столбцам, которые выбираются этим оператором.
Этот атрибут обычно полезен при использовании ORM, так как возвращается расширенная структура, включающая информацию о сопоставленных сущностях. В разделе Проверка сущностей и столбцов из операторов SELECT и DML с поддержкой ORM содержится более подробная информация.
Для оператора Core-only структура, возвращаемая этим аксессором, является производной от тех же объектов, которые возвращаются аксессором
Select.selected_columns
, отформатированных как список словарей, содержащих ключиname
,type
иexpr
, которые указывают выражения столбцов для выбора:>>> stmt = select(user_table) >>> stmt.column_descriptions [ { 'name': 'id', 'type': Integer(), 'expr': Column('id', Integer(), ...)}, { 'name': 'name', 'type': String(length=30), 'expr': Column('name', String(length=30), ...)} ]
Изменено в версии 1.4.33: Атрибут
Select.column_descriptions
возвращает структуру для набора сущностей только Core, а не только ORM.См.также
UpdateBase.entity_description
- информация об объекте дляinsert()
,update()
илиdelete()
Проверка сущностей и столбцов из операторов SELECT и DML с поддержкой ORM - фон ORM
-
attribute
sqlalchemy.sql.expression.Select.
columns_clause_froms¶ Возвращает набор объектов
FromClause
, подразумеваемых предложением columns данного оператора SELECT.Добавлено в версии 1.4.23.
См.также
Select.froms
- «окончательный» список FROM с учетом полного утвержденияSelect.with_only_columns()
- использует эту коллекцию для создания нового списка FROM
-
method
sqlalchemy.sql.expression.Select.
correlate(*fromclauses: Union[Literal[None, False], _FromClauseArgument]) → Self¶ Возвращает новый
Select
, который будет соотносить заданные условия FROM с условиями вложенногоSelect
.Вызов этого метода отключает поведение объекта
Select
по умолчанию - «автокорреляцию». Обычно элементы FROM, которые появляются вSelect
, включающем этот объект через WHERE clause, ORDER BY, HAVING или columns clause, будут опущены вSelect
объекта FROM clause. Задание явной коллекции корреляций с помощью методаSelect.correlate()
обеспечивает фиксированный список объектов FROM, которые потенциально могут иметь место в этом процессе.Когда
Select.correlate()
используется для применения конкретных предложений FROM для корреляции, элементы FROM становятся кандидатами на корреляцию независимо от того, насколько глубоко вложен этот объектSelect
, относительно вложенногоSelect
, который ссылается на тот же объект FROM. Это противоположно поведению «автокорреляции», которая коррелирует только с непосредственно окружающимSelect
. Многоуровневая корреляция гарантирует, что связь между вложенным и объемлющимSelect
всегда осуществляется по крайней мере через одно предложение WHERE/ORDER BY/HAVING/columns, чтобы корреляция имела место.Если передано
None
, объектSelect
не будет коррелировать ни с одной из своих записей FROM, и все они будут безусловно отображаться в локальном предложении FROM.- Параметры:
*fromclauses – одно или несколько
FromClause
или другую конструкцию, совместимую с FROM, например, сопоставленную сущность ORM, чтобы стать частью коллекции коррелятов; альтернативно передайте единственное значениеNone
для удаления всех существующих корреляций.
-
method
sqlalchemy.sql.expression.Select.
correlate_except(*fromclauses: Union[Literal[None, False], _FromClauseArgument]) → Self¶ Возвращает новый
Select
, который будет опускать заданные предложения FROM из процесса автокорреляции.Вызов
Select.correlate_except()
отключает поведение объектаSelect
по умолчанию «автокорреляция» для заданных элементов FROM. Указанный здесь элемент будет безоговорочно появляться в списке FROM, в то время как все остальные элементы FROM остаются подчиненными обычному поведению автокорреляции.Если передано
None
или не передано никаких аргументов, объектSelect
будет сопоставлять все свои записи FROM.- Параметры:
*fromclauses – список одной или нескольких конструкций
FromClause
или других совместимых конструкций (т.е. ORM-mapped classes), которые должны стать частью коллекции correlate-exception.
-
method
sqlalchemy.sql.expression.Select.
corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → Optional[KeyedColumnElement[Any]]¶ наследуется от
Selectable.corresponding_column()
методаSelectable
Учитывая
ColumnElement
, возвращает экспортированный объектColumnElement
из коллекцииSelectable.exported_columns
данногоSelectable
, который соответствует исходномуColumnElement
через общий граф предков.- Параметры:
column – цель
ColumnElement
для сопоставления.require_embedded – возвращает соответствующие столбцы для данного
ColumnElement
только в том случае, если данныйColumnElement
действительно присутствует в подэлементе данногоSelectable
. Обычно столбец будет соответствовать, если он просто имеет общего предка с одним из экспортированных столбцов данногоSelectable
.
См.также
Selectable.exported_columns
-ColumnCollection
, который используется для операции.ColumnCollection.corresponding_column()
- метод реализации.
-
method
sqlalchemy.sql.expression.Select.
cte(name: Optional[str] = None, recursive: bool = False, nesting: bool = False) → CTE¶ наследуется от
HasCTE.cte()
методаHasCTE
Возвращает новый экземпляр
CTE
, или Common Table Expression.Общие табличные выражения - это стандарт SQL, согласно которому операторы SELECT могут использовать вторичные операторы, указанные вместе с первичным оператором, используя предложение под названием «WITH». Специальная семантика UNION также может быть использована для обеспечения «рекурсивных» запросов, когда оператор SELECT может использовать набор строк, которые были выбраны ранее.
CTE также могут применяться к конструкциям DML UPDATE, INSERT и DELETE в некоторых базах данных, как в качестве источника строк CTE в сочетании с RETURNING, так и в качестве потребителя строк CTE.
SQLAlchemy определяет объекты
CTE
, которые рассматриваются аналогично объектамAlias
, как специальные элементы, которые должны быть доставлены в предложение FROM оператора, а также в предложение WITH в верхней части оператора.Для специальных префиксов, таких как PostgreSQL «MATERIALIZED» и «NOT MATERIALIZED», можно использовать метод
CTE.prefix_with()
для их установления.Изменено в версии 1.3.13: Добавлена поддержка префиксов. В частности - МАТЕРИАЛИЗОВАННЫЙ и НЕ МАТЕРИАЛИЗОВАННЫЙ.
- Параметры:
name – имя, присваиваемое общему табличному выражению. Как и
FromClause.alias()
, имя может быть оставлено какNone
, в этом случае во время компиляции запроса будет использоваться анонимный символ.recursive – если
True
, будет отображатьсяWITH RECURSIVE
. Рекурсивное выражение общей таблицы предназначено для использования в сочетании с UNION ALL, чтобы вывести строки из уже выбранных.nesting – если
True
, то CTE будет отображаться локально в операторе, в котором на него ссылаются. Для более сложных сценариев можно также использовать методHasCTE.add_cte()
с параметромHasCTE.add_cte.nest_here
для более тщательного контроля точного размещения конкретного CTE. … версия добавлена:: 1.4.24 .. seealso::HasCTE.add_cte()
Ниже приведены два примера из документации PostgreSQL по адресу https://www.postgresql.org/docs/current/static/queries-with.html, а также дополнительные примеры.
Пример 1, нерекурсивный:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() orders = Table('orders', metadata, Column('region', String), Column('amount', Integer), Column('product', String), Column('quantity', Integer) ) regional_sales = select( orders.c.region, func.sum(orders.c.amount).label('total_sales') ).group_by(orders.c.region).cte("regional_sales") top_regions = select(regional_sales.c.region).\ where( regional_sales.c.total_sales > select( func.sum(regional_sales.c.total_sales) / 10 ) ).cte("top_regions") statement = select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales") ).where(orders.c.region.in_( select(top_regions.c.region) )).group_by(orders.c.region, orders.c.product) result = conn.execute(statement).fetchall()
Пример 2, С РЕКУРСИВНЫМ:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() parts = Table('parts', metadata, Column('part', String), Column('sub_part', String), Column('quantity', Integer), ) included_parts = select(\ parts.c.sub_part, parts.c.part, parts.c.quantity\ ).\ where(parts.c.part=='our part').\ cte(recursive=True) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).\ where(parts_alias.c.part==incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity). label('total_quantity') ).\ group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
Пример 3, апсерт с использованием UPDATE и INSERT с CTE:
from datetime import date from sqlalchemy import (MetaData, Table, Column, Integer, Date, select, literal, and_, exists) metadata = MetaData() visitors = Table('visitors', metadata, Column('product_id', Integer, primary_key=True), Column('date', Date, primary_key=True), Column('count', Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where(and_(visitors.c.product_id == product_id, visitors.c.date == day)) .values(count=visitors.c.count + count) .returning(literal(1)) .cte('update_cte') ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)) .where(~exists(update_cte.select())) ) connection.execute(upsert)
Пример 4, Вложение CTE (SQLAlchemy 1.4.24 и выше):
value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a", nesting=True) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Приведенный выше запрос выведет второй CTE, вложенный в первый, показанный с инлайн-параметрами ниже как:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
Тот же CTE можно настроить с помощью метода
HasCTE.add_cte()
следующим образом (SQLAlchemy 2.0 и выше):value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n). add_cte(value_a_nested, nest_here=True). cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Пример 5, нелинейный CTE (SQLAlchemy 1.4.28 и выше):
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte( "nodes", recursive=True ) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
Приведенный выше запрос выведет 2 UNION внутри рекурсивного CTE:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
См.также
Query.cte()
- ORM-версияHasCTE.cte()
.
-
method
sqlalchemy.sql.expression.Select.
distinct(*expr: _ColumnExpressionArgument[Any]) → Self¶ Возвращает новую конструкцию
select()
, которая будет применять DISTINCT к своему предложению о столбцах.- Параметры:
*expr – необязательные выражения столбцов. Если присутствует, диалект PostgreSQL отобразит конструкцию
DISTINCT ON (<expressions>>)
. … deprecated:: 1.4 Использование *expr в других диалектах является устаревшим и будет вызыватьCompileError
в будущей версии.
-
method
sqlalchemy.sql.expression.Select.
except_(*other: _SelectStatementForCompoundArgument) → CompoundSelect¶ Возвращает SQL
EXCEPT
данной конструкции select() против заданного selectable, предоставленного в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
-
method
sqlalchemy.sql.expression.Select.
except_all(*other: _SelectStatementForCompoundArgument) → CompoundSelect¶ Возвращает SQL
EXCEPT ALL
данной конструкции select() против заданных selectables, предоставленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
-
method
sqlalchemy.sql.expression.Select.
execution_options(**kw: Any) → Self¶ наследуется от
Executable.execution_options()
методаExecutable
Установите для оператора параметры, не относящиеся к SQL, которые вступают в силу во время выполнения.
Параметры выполнения могут быть установлены в различных масштабах, в том числе на запрос, на соединение или на выполнение, с помощью таких методов, как
Connection.execution_options()
и параметров, которые принимают словарь параметров, таких какConnection.execute.execution_options
иSession.execute.execution_options
.Основной характеристикой опции выполнения, в отличие от других видов опций, таких как опции загрузчика ORM, является то, что опции выполнения никогда не влияют на скомпилированный SQL запроса, только на то, что влияет на то, как вызывается сам SQL-запрос или как извлекаются результаты. То есть опции выполнения не являются частью того, что учитывается при компиляции SQL, и не считаются частью кэшированного состояния оператора.
Метод
Executable.execution_options()
является generative, как и в случае применения метода к объектамEngine
иQuery
, что означает, что при вызове метода возвращается копия объекта, которая применяет заданные параметры к этой новой копии, но оставляет оригинал неизменным:statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
Исключением из этого поведения является объект
Connection
, где методConnection.execution_options()
явно не генеративный.Типы параметров, которые могут быть переданы в
Executable.execution_options()
и другие связанные методы и словари параметров, включают параметры, которые явно потребляются SQLAlchemy Core или ORM, а также произвольные аргументы ключевых слов, не определенные SQLAlchemy, что означает, что методы и/или словари параметров могут использоваться для определяемых пользователем параметров, которые взаимодействуют с пользовательским кодом, который может обращаться к параметрам с помощью таких методов, какExecutable.get_execution_options()
иConnection.get_execution_options()
, или в рамках выбранных крючков событий с помощью специального параметра событияexecution_options
, такого какConnectionEvents.before_execute.execution_options
илиORMExecuteState.execution_options
, например. g.:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
В рамках опций, которые явно распознаются SQLAlchemy, большинство из них применяются к определенным классам объектов, а не к другим. К наиболее распространенным опциям выполнения относятся:
Connection.execution_options.isolation_level
- устанавливает уровень изоляции для соединения или класса соединений черезEngine
. Этот параметр принимается толькоConnection
илиEngine
.Connection.execution_options.stream_results
- указывает, что результаты должны быть получены с помощью курсора на стороне сервера; эта опция принимаетсяConnection
, параметромConnection.execute.execution_options
наConnection.execute()
, и дополнительноExecutable.execution_options()
на объекте оператора SQL, а также конструкциями ORM, такими какSession.execute()
.Connection.execution_options.compiled_cache
- указывает словарь, который будет служить SQL compilation cache дляConnection
илиEngine
, а также для методов ORM, таких какSession.execute()
. Может быть передан какNone
, чтобы отключить кэширование для утверждений. Эта опция не принимаетсяExecutable.execution_options()
, поскольку нежелательно переносить кэш компиляции внутри объекта statement.Connection.execution_options.schema_translate_map
- отображение имен схем, используемых функцией Schema Translate Map, принимаемых функциямиConnection
,Engine
,Executable
, а также конструкциями ORM, такими какSession.execute()
.
См.также
Connection.execution_options()
Connection.execute.execution_options
Session.execute.execution_options
Варианты выполнения ORM - документация по всем специфическим для ORM опциям исполнения
-
method
sqlalchemy.sql.expression.Select.
exists() → Exists¶ наследуется от
SelectBase.exists()
методаSelectBase
Возвращает
Exists
представление этого selectable, которое может быть использовано как выражение столбца.Возвращаемый объект является экземпляром
Exists
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.Select.
exported_columns¶ наследуется от
SelectBase.exported_columns
атрибутаSelectBase
ColumnCollection
, который представляет «экспортированные» столбцы данногоSelectable
, не включая конструкцииTextClause
.«Экспортируемые» столбцы для объекта
SelectBase
являются синонимом коллекцииSelectBase.selected_columns
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.Select.
fetch(count: _LimitOffsetType, with_ties: bool = False, percent: bool = False) → Self¶ наследуется от
GenerativeSelect.fetch()
методаGenerativeSelect
Возвращает новый selectable с заданным критерием FETCH FIRST.
Это числовое значение, которое обычно отображается как выражение
FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}
в результирующем select. Эта функциональность в настоящее время реализована для Oracle, PostgreSQL, MSSQL.Используйте
GenerativeSelect.offset()
для указания смещения.Примечание
Метод
GenerativeSelect.fetch()
заменит любую оговорку, примененную с помощьюGenerativeSelect.limit()
.Добавлено в версии 1.4.
- Параметры:
count – целочисленный параметр COUNT или выражение SQL, которое дает целочисленный результат. При
percent=True
это значение будет представлять процент возвращаемых строк, а не абсолютное значение. ПередайтеNone
, чтобы сбросить его.with_ties – Когда
True
, опция WITH TIES используется для возврата всех дополнительных строк, которые занимают последнее место в наборе результатов в соответствии с предложениемORDER BY
. ПараметрORDER BY
может быть обязательным в этом случае. По умолчанию используетсяFalse
.percent – Когда
True
,count
представляет собой процент от общего числа выбранных строк для возврата. По умолчаниюFalse
.
-
method
sqlalchemy.sql.expression.Select.
filter(*criteria: _ColumnExpressionArgument[bool]) → Self¶ Синоним метода
Select.where()
.
-
method
sqlalchemy.sql.expression.Select.
filter_by(**kwargs: Any) → Self¶ применить заданный критерий фильтрации в качестве условия WHERE к данному select.
-
method
sqlalchemy.sql.expression.Select.
from_statement(statement: ReturnsRowsRole) → ExecutableReturnsRows¶ Примените столбцы, которые выберет этот
Select
, к другому оператору.Эта операция является plugin-specific и вызовет исключение not supported, если эта
Select
не выбирает из сущностей, поддерживаемых плагином.Утверждение обычно представляет собой конструкцию
text()
илиselect()
и должно возвращать набор столбцов, соответствующих сущностям, представленным даннымSelect
.См.также
Получение результатов ORM из текстовых высказываний - примеры использования в руководстве по составлению запросов ORM
-
attribute
sqlalchemy.sql.expression.Select.
froms¶ Возвращает отображенный список элементов
FromClause
.Не рекомендуется, начиная с версии 1.4.23: Атрибут
Select.froms
перемещается в методSelect.get_final_froms()
.
-
method
sqlalchemy.sql.expression.Select.
get_children(**kw: Any) → Iterable[ClauseElement]¶ Возвращает непосредственные дочерние
HasTraverseInternals
элементы данногоHasTraverseInternals
.Используется для обхода посещений.
**kw может содержать флаги, изменяющие возвращаемую коллекцию, например, для возврата подмножества элементов, чтобы сократить время обхода, или для возврата дочерних элементов из другого контекста (например, коллекции на уровне схемы, а не на уровне пункта).
-
method
sqlalchemy.sql.expression.Select.
get_execution_options() → _ExecuteOptions¶ наследуется от
Executable.get_execution_options()
методаExecutable
Получить параметры, не относящиеся к SQL, которые будут действовать во время выполнения.
Добавлено в версии 1.3.
См.также
-
method
sqlalchemy.sql.expression.Select.
get_final_froms() → Sequence[FromClause]¶ Вычислите окончательный отображаемый список из
FromClause
элементов.В этом методе будут выполнены все вычисления, необходимые для определения того, какие элементы FROM будут отображены в результирующем операторе SELECT, включая тень отдельных таблиц с объектами JOIN, а также полные вычисления для случаев использования ORM, включая пункты нетерпеливой загрузки.
Для использования в ORM этот аксессор возвращает после компиляции список объектов FROM; эта коллекция будет включать такие элементы, как загруженные с нетерпением таблицы и джойны. Объекты не будут включены в ORM и не будут работать как замена коллекции
Select.select_froms()
; кроме того, этот метод не очень хорошо работает для операторов с поддержкой ORM, так как он повлечет за собой полный процесс построения ORM.Чтобы получить список FROM, который подразумевается коллекцией «columns», переданной в
Select
изначально, используйте аксессорSelect.columns_clause_froms
.Чтобы выбрать из альтернативного набора столбцов, сохраняя список FROM, используйте метод
Select.with_only_columns()
и передайте параметрSelect.with_only_columns.maintain_column_froms
.Добавлено в версии 1.4.23: - the
Select.get_final_froms()
method replaces the previousSelect.froms
accessor, which is deprecated.См.также
-
method
sqlalchemy.sql.expression.Select.
get_label_style() → SelectLabelStyle¶ наследуется от
GenerativeSelect.get_label_style()
методаGenerativeSelect
Получение текущего стиля этикетки.
Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.Select.
group_by(_GenerativeSelect__first: Union[Literal[None, _NoArg.NO_ARG], _ColumnExpressionOrStrLabelArgument[Any]] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ наследуется от
GenerativeSelect.group_by()
методаGenerativeSelect
Возвращает новый selectable с заданным списком критериев GROUP BY.
Все существующие настройки GROUP BY могут быть подавлены путем передачи
None
.например:
stmt = select(table.c.name, func.max(table.c.stat)).\ group_by(table.c.name)
- Параметры:
*clauses – серию конструкций
ColumnElement
, которые будут использоваться для создания предложения GROUP BY.
-
method
sqlalchemy.sql.expression.Select.
having(*having: _ColumnExpressionArgument[bool]) → Self¶ Возвращает новую конструкцию
select()
с заданным выражением, добавленным к пункту HAVING, присоединенным к существующему пункту через AND, если таковой имеется.
-
attribute
sqlalchemy.sql.expression.Select.
inherit_cache: Optional[bool] = None¶ наследуется от
HasCacheKey.inherit_cache
атрибутаHasCacheKey
Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
attribute
sqlalchemy.sql.expression.Select.
inner_columns¶ Итератор всех выражений
ColumnElement
, которые будут выведены в предложение columns результирующего оператора SELECT.Этот метод устарел с версии 1.4 и заменен коллекцией
Select.exported_columns
.
-
method
sqlalchemy.sql.expression.Select.
intersect(*other: _SelectStatementForCompoundArgument) → CompoundSelect¶ Возвращает SQL
INTERSECT
данной конструкции select() против заданных selectables, предоставленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
**kwargs – аргументы ключевого слова передаются в конструктор для вновь созданного объекта
CompoundSelect
.
-
method
sqlalchemy.sql.expression.Select.
intersect_all(*other: _SelectStatementForCompoundArgument) → CompoundSelect¶ Возвращает SQL
INTERSECT ALL
данной конструкции select() против заданных selectables, предоставленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
**kwargs – аргументы ключевого слова передаются в конструктор для вновь созданного объекта
CompoundSelect
.
-
method
sqlalchemy.sql.expression.Select.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ Возвращает
True
, если данныйReturnsRows
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.Select.
join(target: _JoinTargetArgument, onclause: Optional[_OnClauseArgument] = None, *, isouter: bool = False, full: bool = False) → Self¶ Создайте SQL JOIN против критерия этого объекта
Select
и примените генеративно, возвращая новый результирующийSelect
.Например:
stmt = select(user_table).join(address_table, user_table.c.id == address_table.c.user_id)
Приведенный выше оператор генерирует SQL, подобный:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
Изменено в версии 1.4:
Select.join()
теперь создает объектJoin
между источникомFromClause
, который находится внутри пункта FROM существующего SELECT, и заданным целевымFromClause
, а затем добавляет этотJoin
к пункту FROM вновь созданного оператора SELECT. Это полностью переработано по сравнению с поведением в 1.3, где вместо этого создавался подзапрос всегоSelect
и затем этот подзапрос присоединялся к целевому.Это обратное несовместимое изменение, поскольку предыдущее поведение было в основном бесполезным, создавая безымянный подзапрос, отвергаемый большинством баз данных в любом случае. Новое поведение моделируется по образцу очень успешного метода
Query.join()
в ORM, чтобы поддержать функциональностьQuery
, доступную при использовании объектаSelect
с объектомSession
.См. примечания к этому изменению в select().join() и outerjoin() добавляют критерии JOIN к текущему запросу, а не создают подзапрос.
- Параметры:
target – целевая таблица для присоединения к
onclause – Предложение ON для объединения. Если опущено, предложение ON генерируется автоматически на основе связей
ForeignKey
между двумя таблицами, если они могут быть однозначно определены, в противном случае выдается ошибка.isouter – если True, генерирует LEFT OUTER join. Аналогично
Select.outerjoin()
.full – если True, генерировать ПОЛНОЕ ВНЕШНЕЕ присоединение.
-
method
sqlalchemy.sql.expression.Select.
join_from(from_: _FromClauseArgument, target: _JoinTargetArgument, onclause: Optional[_OnClauseArgument] = None, *, isouter: bool = False, full: bool = False) → Self¶ Создайте SQL JOIN против критерия этого объекта
Select
и примените генеративно, возвращая новый результирующийSelect
.Например:
stmt = select(user_table, address_table).join_from( user_table, address_table, user_table.c.id == address_table.c.user_id )
Приведенный выше оператор генерирует SQL, подобный:
SELECT user.id, user.name, address.id, address.email, address.user_id FROM user JOIN address ON user.id = address.user_id
Добавлено в версии 1.4.
- Параметры:
from_ – левая часть соединения, будет отображена в предложении FROM и примерно эквивалентна использованию метода
Select.select_from()
.target – целевая таблица для присоединения к
onclause – ON клаузула объединения.
isouter – если True, генерирует LEFT OUTER join. Аналогично
Select.outerjoin()
.full – если True, генерировать ПОЛНОЕ ВНЕШНЕЕ присоединение.
-
method
sqlalchemy.sql.expression.Select.
label(name: Optional[str]) → Label[Any]¶ наследуется от
SelectBase.label()
методаSelectBase
Возвращает «скалярное» представление этого selectable, встроенное в виде подзапроса с меткой.
См.также
-
method
sqlalchemy.sql.expression.Select.
lateral(name: Optional[str] = None) → LateralFromClause¶ наследуется от
SelectBase.lateral()
методаSelectBase
Возвращает ЛАТЕРАЛЬНЫЙ псевдоним данного
Selectable
.Возвращаемым значением является конструкция
Lateral
, также предоставляемая функцией верхнего уровняlateral()
.См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
-
method
sqlalchemy.sql.expression.Select.
limit(limit: _LimitOffsetType) → Self¶ наследуется от
GenerativeSelect.limit()
методаGenerativeSelect
Возвращает новый selectable с заданным критерием LIMIT.
Это числовое значение, которое обычно отображается как выражение
LIMIT
в результирующем select. Бэкенды, не поддерживающиеLIMIT
, будут пытаться обеспечить аналогичную функциональность.Примечание
Метод
GenerativeSelect.limit()
заменит любую оговорку, примененную с помощьюGenerativeSelect.fetch()
.- Параметры:
limit – целочисленный параметр LIMIT, или выражение SQL, которое дает целочисленный результат. Передайте
None
, чтобы сбросить его.
-
method
sqlalchemy.sql.expression.Select.
offset(offset: _LimitOffsetType) → Self¶ наследуется от
GenerativeSelect.offset()
методаGenerativeSelect
Возвращает новый selectable с заданным критерием OFFSET.
Это числовое значение, которое обычно отображается как выражение
OFFSET
в результирующем select. Бэкенды, не поддерживающиеOFFSET
, будут пытаться обеспечить аналогичную функциональность.- Параметры:
offset – целочисленный параметр OFFSET, или выражение SQL, которое дает целочисленный результат. Передайте
None
, чтобы сбросить его.
-
method
sqlalchemy.sql.expression.Select.
options(*options: ExecutableOption) → Self¶ наследуется от
Executable.options()
методаExecutable
Примените варианты к этому утверждению.
В общем смысле опции - это любой вид объекта Python, который может быть интерпретирован компилятором SQL для оператора. Эти опции могут потребляться конкретными диалектами или конкретными видами компиляторов.
Наиболее известным видом опций являются опции уровня ORM, которые применяют «жаждущую загрузку» и другие способы загрузки к запросам ORM. Однако теоретически опции могут использоваться и для многих других целей.
Для получения информации о конкретных видах опций для конкретных видов утверждений, обратитесь к документации для этих объектов опций.
Изменено в версии 1.4: - added
Executable.options()
to Core statement objects towards the goal of allowing unified Core / ORM querying capabilities.См.также
Варианты загрузки колонн - относится к опциям, специфичным для использования ORM-запросов
Загрузка отношений с помощью опций загрузчика - относится к опциям, специфичным для использования ORM-запросов
-
method
sqlalchemy.sql.expression.Select.
order_by(_GenerativeSelect__first: Union[Literal[None, _NoArg.NO_ARG], _ColumnExpressionOrStrLabelArgument[Any]] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ наследуется от
GenerativeSelect.order_by()
методаGenerativeSelect
Возвращает новый selectable с заданным списком критериев ORDER BY.
например:
stmt = select(table).order_by(table.c.id, table.c.name)
Вызов этого метода несколько раз эквивалентен вызову его один раз с конкатенацией всех пунктов. Все существующие критерии ORDER BY могут быть отменены, передав
None
сам по себе. Новые критерии ORDER BY могут быть добавлены путем повторного вызоваQuery.order_by()
, например:# will erase all ORDER BY and ORDER BY new_col alone stmt = stmt.order_by(None).order_by(new_col)
- Параметры:
*clauses – серию конструкций
ColumnElement
, которые будут использоваться для создания предложения ORDER BY.
-
method
sqlalchemy.sql.expression.Select.
outerjoin(target: _JoinTargetArgument, onclause: Optional[_OnClauseArgument] = None, *, full: bool = False) → Self¶ Создайте левое внешнее объединение.
Параметры те же, что и у
Select.join()
.Изменено в версии 1.4:
Select.outerjoin()
теперь создает объектJoin
между источникомFromClause
, который находится внутри пункта FROM существующего SELECT, и заданным целевымFromClause
, а затем добавляет этотJoin
к пункту FROM вновь созданного оператора SELECT. Это полностью переработано по сравнению с поведением в 1.3, где вместо этого создавался подзапрос всегоSelect
и затем этот подзапрос присоединялся к целевому.Это обратное несовместимое изменение, поскольку предыдущее поведение было в основном бесполезным, создавая безымянный подзапрос, отвергаемый большинством баз данных в любом случае. Новое поведение моделируется по образцу очень успешного метода
Query.join()
в ORM, чтобы поддержать функциональностьQuery
, доступную при использовании объектаSelect
с объектомSession
.См. примечания к этому изменению в select().join() и outerjoin() добавляют критерии JOIN к текущему запросу, а не создают подзапрос.
-
method
sqlalchemy.sql.expression.Select.
outerjoin_from(from_: _FromClauseArgument, target: _JoinTargetArgument, onclause: Optional[_OnClauseArgument] = None, *, full: bool = False) → Self¶ Создайте SQL LEFT OUTER JOIN против критерия этого объекта
Select
и примените генеративно, возвращая новый результирующийSelect
.Используется так же, как и
Select.join_from()
.
-
method
sqlalchemy.sql.expression.Select.
prefix_with(*prefixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ наследуется от
HasPrefixes.prefix_with()
методаHasPrefixes
Добавьте одно или несколько выражений после ключевого слова statement, т.е. SELECT, INSERT, UPDATE или DELETE. Генеративный.
Используется для поддержки префиксных ключевых слов, специфичных для бэкенда, таких как те, которые предоставляет MySQL.
Например:
stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") # MySQL 5.7 optimizer hints stmt = select(table).prefix_with( "/*+ BKA(t1) */", dialect="mysql")
Несколько префиксов могут быть заданы несколькими вызовами
HasPrefixes.prefix_with()
.- Параметры:
*prefixes – текстовая или
ClauseElement
конструкция, которая будет отображаться после ключевого слова INSERT, UPDATE или DELETE.dialect – необязательное строковое имя диалекта, которое ограничит отображение этого префикса только этим диалектом.
-
method
sqlalchemy.sql.expression.Select.
reduce_columns(only_synonyms: bool = True) → Select¶ Возвращает новую конструкцию
select()
с избыточными именованными, эквивалентно-оцениваемыми столбцами, удаленными из условия columns.Под «избыточными» здесь подразумеваются два столбца, один из которых ссылается на другой либо на основе внешнего ключа, либо через простое сравнение равенства в пункте WHERE оператора. Основной целью этого метода является автоматическое построение оператора select со всеми уникально названными столбцами, без необходимости использования таблично-квалификационных меток, как это делает
Select.set_label_style()
.Если столбцы опущены на основе внешнего ключа, то сохраняется столбец со ссылкой. Если столбцы опущены на основе эквивалентности WHERE, сохраняется первый столбец в предложении columns.
- Параметры:
only_synonyms – если True, ограничивает удаление столбцов только теми, которые имеют то же имя, что и эквивалент. В противном случае удаляются все столбцы, которые эквивалентны другому.
-
method
sqlalchemy.sql.expression.Select.
replace_selectable(old: FromClause, alias: Alias) → Self¶ наследуется от
Selectable.replace_selectable()
методаSelectable
Заменяет все вхождения
FromClause
„old“ на данный объектAlias
, возвращая копию этогоFromClause
.Не рекомендуется, начиная с версии 1.4: Метод
Selectable.replace_selectable()
является устаревшим и будет удален в одном из будущих выпусков. Аналогичная функциональность доступна через модуль sqlalchemy.sql.visitors.
-
method
sqlalchemy.sql.expression.Select.
scalar_subquery() → ScalarSelect[Any]¶ наследуется от
SelectBase.scalar_subquery()
методаSelectBase
Возвращает «скалярное» представление этого selectable, которое может быть использовано в качестве выражения столбца.
Возвращаемый объект является экземпляром
ScalarSelect
.Как правило, оператор select, имеющий только один столбец в пункте columns, может быть использован в качестве скалярного выражения. Затем скалярный подзапрос можно использовать в пункте WHERE или в пункте columns заключающего оператора SELECT.
Обратите внимание, что скалярный подзапрос отличается от подзапроса уровня FROM, который может быть получен с помощью метода
SelectBase.subquery()
.См.также
Скалярные и коррелированные подзапросы - в учебнике 2.0
-
method
sqlalchemy.sql.expression.Select.
select(*arg: Any, **kw: Any) → Select¶ наследуется от
SelectBase.select()
методаSelectBase
Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.select()
является устаревшим и будет удален в будущем выпуске; этот метод неявно создает подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем можно будет выбрать.
-
method
sqlalchemy.sql.expression.Select.
select_from(*froms: _FromClauseArgument) → Self¶ Возвращает новую конструкцию
select()
с заданным выражением FROM, объединенным в список объектов FROM.Например:
table1 = table('t1', column('a')) table2 = table('t2', column('b')) s = select(table1.c.a).\ select_from( table1.join(table2, table1.c.a==table2.c.b) )
Список «from» является уникальным набором идентификаторов каждого элемента, поэтому добавление уже присутствующего
Table
или другого выбираемого элемента не будет иметь никакого эффекта. ПередачаJoin
, который ссылается на уже присутствующийTable
или другой выбираемый элемент, будет иметь эффект сокрытия присутствия этого выбираемого элемента как отдельного элемента в отображаемом списке FROM, вместо этого превращая его в предложение JOIN.Хотя типичная цель
Select.select_from()
- заменить стандартное производное предложение FROM на объединение, его также можно вызвать с отдельными элементами таблицы, при желании несколько раз, в случае, если предложение FROM не может быть полностью выведено из предложения columns:select(func.count('*')).select_from(table1)
-
attribute
sqlalchemy.sql.expression.Select.
selected_columns¶ ColumnCollection
, представляющий столбцы, которые данный оператор SELECT или аналогичная конструкция возвращает в свой набор результатов, не включая конструкцииTextClause
.Эта коллекция отличается от коллекции
FromClause.columns
FromClause
тем, что столбцы в этой коллекции не могут быть непосредственно вложены в другой оператор SELECT; сначала должен быть применен подзапрос, который обеспечивает необходимые скобки, требуемые SQL.Для конструкции
select()
коллекция здесь представляет собой именно то, что будет отображено внутри оператора «SELECT», а объектыColumnElement
представлены непосредственно в том виде, в котором они были заданы, например:col1 = column('q', Integer) col2 = column('p', Integer) stmt = select(col1, col2)
Выше,
stmt.selected_columns
будет коллекцией, которая содержит непосредственно объектыcol1
иcol2
. Для оператора, направленного противTable
или другогоFromClause
, коллекция будет использовать объектыColumnElement
, которые находятся в коллекцииFromClause.c
элемента from.Примечание
Коллекция
Select.selected_columns
не включает выражения, установленные в предложении columns с помощью конструкцииtext()
; они молча опускаются из коллекции. Чтобы использовать обычные текстовые выражения столбцов внутри конструкцииSelect
, используйте конструкциюliteral_column()
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.Select.
self_group(against: Optional[OperatorType] = None) → Union[SelectStatementGrouping, Self]¶ Примените «группировку» к этому
ClauseElement
.Этот метод переопределяется подклассами для возврата конструкции «группировки», т.е. круглой скобки. В частности, она используется «бинарными» выражениями для обеспечения группировки вокруг себя при помещении в более крупное выражение, а также конструкциями
select()
при помещении в предложение FROM другогоselect()
. (Обратите внимание, что подзапросы обычно следует создавать с помощью методаSelect.alias()
, поскольку многие платформы требуют, чтобы вложенные операторы SELECT были именованными).Поскольку выражения составляются вместе, применение
self_group()
происходит автоматически - код конечного пользователя никогда не должен использовать этот метод напрямую. Обратите внимание, что в конструкциях клаузул SQLAlchemy учитывается приоритет операторов - поэтому скобки могут не понадобиться, например, в выраженииx OR (y AND z)
- AND имеет приоритет над OR.Базовый метод
self_group()
ClauseElement
просто возвращает self.
-
method
sqlalchemy.sql.expression.Select.
set_label_style(style: SelectLabelStyle) → Self¶ наследуется от
GenerativeSelect.set_label_style()
методаGenerativeSelect
Возвращает новый selectable с указанным стилем метки.
Существует три «стиля этикеток»:
SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY
,SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL
иSelectLabelStyle.LABEL_STYLE_NONE
. По умолчанию используется стильSelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL
.В современной SQLAlchemy, как правило, нет необходимости менять стиль маркировки, поскольку метки на выражение более эффективно используются с помощью метода
ColumnElement.label()
. В прошлых версияхLABEL_STYLE_TABLENAME_PLUS_COL
использовался для однозначного определения одноименных колонок из разных таблиц, псевдонимов или подзапросов; более новыйLABEL_STYLE_DISAMBIGUATE_ONLY
теперь применяет метки только к именам, которые конфликтуют с существующими именами, так что влияние этой маркировки минимально.Разграничение необходимо для того, чтобы при создании подзапроса все выражения столбцов были доступны из данной коллекции
FromClause.c
.Добавлено в версии 1.4: - the
GenerativeSelect.set_label_style()
method replaces the previous combination of.apply_labels()
,.with_labels()
anduse_labels=True
methods and/or parameters.См.также
LABEL_STYLE_DISAMBIGUATE_ONLY
LABEL_STYLE_TABLENAME_PLUS_COL
LABEL_STYLE_NONE
LABEL_STYLE_DEFAULT
-
method
sqlalchemy.sql.expression.Select.
slice(start: int, stop: int) → Self¶ наследуется от
GenerativeSelect.slice()
методаGenerativeSelect
Примените LIMIT / OFFSET к этому утверждению на основе среза.
Индексы start и stop ведут себя как аргументы встроенной в Python функции
range()
. Этот метод является альтернативой использованиюLIMIT
/OFFSET
для получения фрагмента запроса.Например,
stmt = select(User).order_by(User).id.slice(1, 3)
отображается как
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
Примечание
Метод
GenerativeSelect.slice()
заменит любую оговорку, примененную с помощьюGenerativeSelect.fetch()
.Добавлено в версии 1.4: Добавлен метод
GenerativeSelect.slice()
, обобщенный из ORM.
-
method
sqlalchemy.sql.expression.Select.
subquery(name: Optional[str] = None) → Subquery¶ наследуется от
SelectBase.subquery()
методаSelectBase
Возвращает подзапрос данного
SelectBase
.С точки зрения SQL подзапрос - это именованная конструкция со скобками, которая может быть помещена в предложение FROM другого оператора SELECT.
Учитывая оператор SELECT, такой как:
stmt = select(table.c.id, table.c.name)
Приведенное выше утверждение может выглядеть следующим образом:
SELECT table.id, table.name FROM table
Форма подзапроса сама по себе отображается таким же образом, однако при вставке в предложение FROM другого оператора SELECT она становится именованным подэлементом:
subq = stmt.subquery() new_stmt = select(subq)
Вышеуказанное переводится как:
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
Исторически,
SelectBase.subquery()
эквивалентен вызову методаFromClause.alias()
на объекте FROM; однако, поскольку объектSelectBase
не является непосредственно объектом FROM, методSelectBase.subquery()
обеспечивает более четкую семантику.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.Select.
suffix_with(*suffixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ наследуется от
HasSuffixes.suffix_with()
методаHasSuffixes
Добавьте одно или несколько выражений, следующих за высказыванием в целом.
Это используется для поддержки специфических для бэкенда суффиксных ключевых слов в определенных конструкциях.
Например:
stmt = select(col1, col2).cte().suffix_with( "cycle empno set y_cycle to 1 default 0", dialect="oracle")
Несколько суффиксов могут быть заданы несколькими вызовами
HasSuffixes.suffix_with()
.- Параметры:
*suffixes – текстовая или
ClauseElement
конструкция, которая будет выведена после целевой клаузы.dialect – Необязательное строковое имя диалекта, которое ограничит отображение этого суффикса только этим диалектом.
-
method
sqlalchemy.sql.expression.Select.
union(*other: _SelectStatementForCompoundArgument) → CompoundSelect¶ Возвращает SQL
UNION
данной конструкции select() против заданных selectables, предоставленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
**kwargs – аргументы ключевого слова передаются в конструктор для вновь созданного объекта
CompoundSelect
.
-
method
sqlalchemy.sql.expression.Select.
union_all(*other: _SelectStatementForCompoundArgument) → CompoundSelect¶ Возвращает SQL
UNION ALL
данной конструкции select() против заданных selectables, предоставленных в качестве позиционных аргументов.- Параметры:
*other – один или несколько элементов, с помощью которых можно создать объединение. … versionchanged:: 1.4.28 теперь принимаются множественные элементы.
**kwargs – аргументы ключевого слова передаются в конструктор для вновь созданного объекта
CompoundSelect
.
-
method
sqlalchemy.sql.expression.Select.
where(*whereclause: _ColumnExpressionArgument[bool]) → Self¶ Возвращает новую конструкцию
select()
с заданным выражением, добавленным к пункту WHERE, присоединенным к существующему пункту через AND, если таковой имеется.
-
attribute
sqlalchemy.sql.expression.Select.
whereclause¶ Возвращает заполненное предложение WHERE для данного оператора
Select
.Это собирает текущую коллекцию критериев WHERE в одну конструкцию
BooleanClauseList
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.Select.
with_for_update(*, nowait: bool = False, read: bool = False, of: Optional[_ForUpdateOfArgument] = None, skip_locked: bool = False, key_share: bool = False) → Self¶ наследуется от
GenerativeSelect.with_for_update()
методаGenerativeSelect
Укажите условие
FOR UPDATE
для этогоGenerativeSelect
.Например:
stmt = select(table).with_for_update(nowait=True)
В базе данных, например, PostgreSQL или Oracle, вышеприведенное выражение будет выглядеть так:
SELECT table.a, table.b FROM table FOR UPDATE NOWAIT
на других бэкендах опция
nowait
игнорируется и вместо нее выдается:SELECT table.a, table.b FROM table FOR UPDATE
При вызове без аргументов утверждение будет отображаться с суффиксом
FOR UPDATE
. Затем могут быть предоставлены дополнительные аргументы, которые позволяют использовать общие варианты, специфичные для базы данных.- Параметры:
nowait – boolean; будет отображать
FOR UPDATE NOWAIT
на диалектах Oracle и PostgreSQL.read – boolean; будет отображать
LOCK IN SHARE MODE
на MySQL,FOR SHARE
на PostgreSQL. На PostgreSQL, в сочетании сnowait
, будет отображатьсяFOR SHARE NOWAIT
.of – SQL-выражение или список элементов SQL-выражения (обычно
Column
объектов или совместимое выражение, для некоторых бэкендов может быть и табличным выражением), которое будет отображаться в предложениеFOR UPDATE OF
; поддерживается PostgreSQL, Oracle, некоторыми версиями MySQL и, возможно, другими. Может отображаться как таблица или как столбец в зависимости от бэкенда.skip_locked – boolean, будет выводить
FOR UPDATE SKIP LOCKED
на диалектах Oracle и PostgreSQL илиFOR SHARE SKIP LOCKED
, если также указаноread=True
.key_share – boolean, будет отображать
FOR NO KEY UPDATE
, или в сочетании сread=True
будет отображатьFOR KEY SHARE
, на диалекте PostgreSQL.
-
method
sqlalchemy.sql.expression.Select.
with_hint(selectable: _FromClauseArgument, text: str, dialect_name: str = '*') → Self¶ наследуется от
HasHints.with_hint()
методаHasHints
Добавляет подсказку индексации или другого контекста выполнения для данного selectable к этому
Select
или другому объекту selectable.Текст подсказки отображается в соответствующем месте для используемого бэкенда базы данных, относительно заданного
Table
илиAlias
, переданного в качестве аргументаselectable
. Реализация диалекта обычно использует синтаксис подстановки строк Python с маркером%(name)s
для отображения имени таблицы или псевдонима. Например, при использовании Oracle можно использовать следующее:select(mytable).\ with_hint(mytable, "index(%(name)s ix_mytable)")
SQL будет выглядеть так:
select /*+ index(mytable ix_mytable) */ ... from mytable
Опция
dialect_name
ограничивает отображение конкретной подсказки для определенного бэкенда. Например, чтобы добавить подсказки для Oracle и Sybase одновременно:select(mytable).\ with_hint(mytable, "index(%(name)s ix_mytable)", 'oracle').\ with_hint(mytable, "WITH INDEX ix_mytable", 'mssql')
См.также
-
method
sqlalchemy.sql.expression.Select.
with_only_columns(*entities: _ColumnsClauseArgument[Any], maintain_column_froms: bool = False, **_Select__kw: Any) → Select[Any]¶ Возвращает новую конструкцию
select()
, в которой условие столбцов заменено заданными сущностями.По умолчанию этот метод эквивалентен тому, как если бы исходный
select()
был вызван с заданными сущностями. Например, оператор:s = select(table1.c.a, table1.c.b) s = s.with_only_columns(table1.c.b)
должно быть точно эквивалентно:
s = select(table1.c.b)
В этом режиме работы
Select.with_only_columns()
будет также динамически изменять предложение FROM в операторе, если оно не указано явно. Чтобы сохранить существующий набор FROM, включая те, которые подразумеваются текущим предложением columns, добавьте параметрSelect.with_only_columns.maintain_column_froms
:s = select(table1.c.a, table2.c.b) s = s.with_only_columns(table1.c.a, maintain_column_froms=True)
Указанный выше параметр выполняет передачу эффективных FROM в коллекции столбцов в метод
Select.select_from()
, как если бы было вызвано следующее:s = select(table1.c.a, table2.c.b) s = s.select_from(table1, table2).with_only_columns(table1.c.a)
Параметр
Select.with_only_columns.maintain_column_froms
использует коллекциюSelect.columns_clause_froms
и выполняет операцию, эквивалентную следующей:s = select(table1.c.a, table2.c.b) s = s.select_from(*s.columns_clause_froms).with_only_columns(table1.c.a)
- Параметры:
*entities – выражения столбцов, которые будут использоваться.
maintain_column_froms – булев параметр, который гарантирует, что список FROM, подразумеваемый в предложении текущих колонок, будет передан в метод
Select.select_from()
первым. … versionadded:: 1.4.23
-
method
sqlalchemy.sql.expression.Select.
with_statement_hint(text: str, dialect_name: str = '*') → Self¶ наследуется от
HasHints.with_statement_hint()
методаHasHints
Добавить подсказку утверждения к этому
Select
или другому выбираемому объекту.Этот метод похож на
Select.with_hint()
, за исключением того, что он не требует отдельной таблицы, а применяется к утверждению в целом.Подсказки здесь специфичны для базы данных бэкенда и могут включать такие директивы, как уровни изоляции, директивы для файлов, директивы для выборки и т.д.
См.также
Select.prefix_with()
- общий префикс SELECT, который также может подходить для некоторых специфических для базы данных синтаксисов HINT, таких как подсказки оптимизатора MySQL
-
method
- class sqlalchemy.sql.expression.Selectable¶
Пометить класс как выбираемый.
Members
corresponding_column(), exported_columns, inherit_cache, is_derived_from(), lateral(), replace_selectable()
Классная подпись
класс
sqlalchemy.sql.expression.Selectable
(sqlalchemy.sql.expression.ReturnsRows
)-
method
sqlalchemy.sql.expression.Selectable.
corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → Optional[KeyedColumnElement[Any]]¶ Учитывая
ColumnElement
, возвращает экспортированный объектColumnElement
из коллекцииSelectable.exported_columns
данногоSelectable
, который соответствует исходномуColumnElement
через общий граф предков.- Параметры:
column – цель
ColumnElement
для сопоставления.require_embedded – возвращает соответствующие столбцы для данного
ColumnElement
только в том случае, если данныйColumnElement
действительно присутствует в подэлементе данногоSelectable
. Обычно столбец будет соответствовать, если он просто имеет общего предка с одним из экспортированных столбцов данногоSelectable
.
См.также
Selectable.exported_columns
-ColumnCollection
, который используется для операции.ColumnCollection.corresponding_column()
- метод реализации.
-
attribute
sqlalchemy.sql.expression.Selectable.
exported_columns¶ наследуется от
ReturnsRows.exported_columns
атрибутаReturnsRows
ColumnCollection
, который представляет «экспортированные» столбцы данногоReturnsRows
.Экспортируемые» столбцы представляют собой набор выражений
ColumnElement
, которые отображаются этой конструкцией SQL. Существуют первичные разновидности, которые являются «столбцами предложения FROM» в предложении FROM, таком как таблица, объединение или подзапрос, «выбираемые столбцы», которые являются столбцами в предложении «столбцы» оператора SELECT, и столбцы RETURNING в операторе DML…Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.Selectable.
inherit_cache: Optional[bool] = None¶ наследуется от
HasCacheKey.inherit_cache
атрибутаHasCacheKey
Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
sqlalchemy.sql.expression.Selectable.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ наследуется от
ReturnsRows.is_derived_from()
методаReturnsRows
Возвращает
True
, если данныйReturnsRows
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.Selectable.
lateral(name: Optional[str] = None) → LateralFromClause¶ Возвращает ЛАТЕРАЛЬНЫЙ псевдоним данного
Selectable
.Возвращаемым значением является конструкция
Lateral
, также предоставляемая функцией верхнего уровняlateral()
.См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
-
method
sqlalchemy.sql.expression.Selectable.
replace_selectable(old: FromClause, alias: Alias) → Self¶ Заменяет все вхождения
FromClause
„old“ на данный объектAlias
, возвращая копию этогоFromClause
.Не рекомендуется, начиная с версии 1.4: Метод
Selectable.replace_selectable()
является устаревшим и будет удален в одном из будущих выпусков. Аналогичная функциональность доступна через модуль sqlalchemy.sql.visitors.
-
method
- class sqlalchemy.sql.expression.SelectBase¶
Базовый класс для операторов SELECT.
Сюда входят
Select
,CompoundSelect
иTextualSelect
.Members
add_cte(), alias(), as_scalar(), c, corresponding_column(), cte(), exists(), exported_columns, get_label_style(), inherit_cache, is_derived_from(), label(), lateral(), replace_selectable(), scalar_subquery(), select(), selected_columns, set_label_style(), subquery()
Классная подпись
class
sqlalchemy.sql.expression.SelectBase
(sqlalchemy.sql.roles.SelectStatementRole
,sqlalchemy.sql.roles.DMLSelectRole
,sqlalchemy.sql.roles.CompoundElementRole
,sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.expression.HasCTE
,sqlalchemy.sql.annotation.SupportsCloneAnnotations
,sqlalchemy.sql.expression.Selectable
)-
method
sqlalchemy.sql.expression.SelectBase.
add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ наследуется от
HasCTE.add_cte()
методаHasCTE
Добавьте к этому утверждению одну или несколько конструкций
CTE
.Этот метод свяжет заданные конструкции
CTE
с родительским оператором таким образом, что каждая из них будет безоговорочно отображена в предложение WITH конечного оператора, даже если на нее нет ссылок в других местах оператора или вложенных селектов.Необязательный параметр
HasCTE.add_cte.nest_here
при установке в True будет иметь тот эффект, что каждый данныйCTE
будет отображаться в предложении WITH, отображаемом непосредственно вместе с этим утверждением, а не перемещаться в начало конечного отображаемого утверждения, даже если это утверждение отображается как подзапрос внутри более крупного утверждения.Этот метод имеет два общих применения. Первое - это встраивание операторов CTE, которые служат некоторым целям без явных ссылок, например, в случае встраивания оператора DML, такого как INSERT или UPDATE, в качестве CTE в линию с основным оператором, который может косвенно использовать его результаты. Другая задача - обеспечить контроль над точным размещением определенной серии конструкций CTE, которые должны оставаться отображенными непосредственно в терминах конкретного оператора, который может быть вложен в более крупный оператор.
Например:
from sqlalchemy import table, column, select t = table('t', column('c1'), column('c2')) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
Будет оказывать:
WITH anon_1 AS (INSERT INTO t (c1, c2) VALUES (:param_1, :param_2)) SELECT t.c1, t.c2 FROM t
Выше, CTE «anon_1» не упоминается в операторе SELECT, но все же выполняет задачу запуска оператора INSERT.
Аналогично в контексте, связанном с DML, использование конструкции PostgreSQL
Insert
для создания «upsert»:from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = ( t.delete().where(t.c.c1 < 1).cte("deletions") ) insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
Вышеприведенное утверждение выглядит следующим образом:
WITH deletions AS (DELETE FROM t WHERE t.c1 < %(c1_1)s) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
Добавлено в версии 1.4.21.
- Параметры:
*ctes – ноль или более конструкций
CTE
. … versionchanged:: 2.0 Принимаются несколько экземпляров CTEnest_here – если True, то данный CTE или CTE будут отображаться так, как если бы при добавлении их в данный
HasCTE
был указан флагHasCTE.cte.nesting
вTrue
. Если предполагается, что на данные CTE не ссылаются во внешнем охватывающем утверждении, то при установке этого флага данные CTE будут отображаться на уровне этого утверждения. … версия добавлена:: 2.0 .. seealso::HasCTE.cte.nesting
-
method
sqlalchemy.sql.expression.SelectBase.
alias(name: Optional[str] = None, flat: bool = False) → Subquery¶ Возвращает именованный подзапрос к данному
SelectBase
.Для
SelectBase
(в отличие отFromClause
) это возвращает объектSubquery
, который ведет себя в основном так же, как объектAlias
, который используется сFromClause
.Изменено в версии 1.4: Метод
SelectBase.alias()
теперь является синонимом методаSelectBase.subquery()
.
-
method
sqlalchemy.sql.expression.SelectBase.
as_scalar() → ScalarSelect[Any]¶ Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.as_scalar()
является устаревшим и будет удален в одном из будущих выпусков. Пожалуйста, обратитесь кSelectBase.scalar_subquery()
.
-
attribute
sqlalchemy.sql.expression.SelectBase.
c¶ Не рекомендуется, начиная с версии 1.4: Атрибуты
SelectBase.c
иSelectBase.columns
устарели и будут удалены в будущем релизе; эти атрибуты неявно создают подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем будет содержать этот атрибут. Для доступа к столбцам, из которых выбирает данный объект SELECT, используйте атрибутSelectBase.selected_columns
.
-
method
sqlalchemy.sql.expression.SelectBase.
corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → Optional[KeyedColumnElement[Any]]¶ наследуется от
Selectable.corresponding_column()
методаSelectable
Учитывая
ColumnElement
, возвращает экспортированный объектColumnElement
из коллекцииSelectable.exported_columns
данногоSelectable
, который соответствует исходномуColumnElement
через общий граф предков.- Параметры:
column – цель
ColumnElement
для сопоставления.require_embedded – возвращает соответствующие столбцы для данного
ColumnElement
только в том случае, если данныйColumnElement
действительно присутствует в подэлементе данногоSelectable
. Обычно столбец будет соответствовать, если он просто имеет общего предка с одним из экспортированных столбцов данногоSelectable
.
См.также
Selectable.exported_columns
-ColumnCollection
, который используется для операции.ColumnCollection.corresponding_column()
- метод реализации.
-
method
sqlalchemy.sql.expression.SelectBase.
cte(name: Optional[str] = None, recursive: bool = False, nesting: bool = False) → CTE¶ наследуется от
HasCTE.cte()
методаHasCTE
Возвращает новый экземпляр
CTE
, или Common Table Expression.Общие табличные выражения - это стандарт SQL, согласно которому операторы SELECT могут использовать вторичные операторы, указанные вместе с первичным оператором, используя предложение под названием «WITH». Специальная семантика UNION также может быть использована для обеспечения «рекурсивных» запросов, когда оператор SELECT может использовать набор строк, которые были выбраны ранее.
CTE также могут применяться к конструкциям DML UPDATE, INSERT и DELETE в некоторых базах данных, как в качестве источника строк CTE в сочетании с RETURNING, так и в качестве потребителя строк CTE.
SQLAlchemy определяет объекты
CTE
, которые рассматриваются аналогично объектамAlias
, как специальные элементы, которые должны быть доставлены в предложение FROM оператора, а также в предложение WITH в верхней части оператора.Для специальных префиксов, таких как PostgreSQL «MATERIALIZED» и «NOT MATERIALIZED», можно использовать метод
CTE.prefix_with()
для их установления.Изменено в версии 1.3.13: Добавлена поддержка префиксов. В частности - МАТЕРИАЛИЗОВАННЫЙ и НЕ МАТЕРИАЛИЗОВАННЫЙ.
- Параметры:
name – имя, присваиваемое общему табличному выражению. Как и
FromClause.alias()
, имя может быть оставлено какNone
, в этом случае во время компиляции запроса будет использоваться анонимный символ.recursive – если
True
, будет отображатьсяWITH RECURSIVE
. Рекурсивное выражение общей таблицы предназначено для использования в сочетании с UNION ALL, чтобы вывести строки из уже выбранных.nesting – если
True
, то CTE будет отображаться локально в операторе, в котором на него ссылаются. Для более сложных сценариев можно также использовать методHasCTE.add_cte()
с параметромHasCTE.add_cte.nest_here
для более тщательного контроля точного размещения конкретного CTE. … версия добавлена:: 1.4.24 .. seealso::HasCTE.add_cte()
Ниже приведены два примера из документации PostgreSQL по адресу https://www.postgresql.org/docs/current/static/queries-with.html, а также дополнительные примеры.
Пример 1, нерекурсивный:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() orders = Table('orders', metadata, Column('region', String), Column('amount', Integer), Column('product', String), Column('quantity', Integer) ) regional_sales = select( orders.c.region, func.sum(orders.c.amount).label('total_sales') ).group_by(orders.c.region).cte("regional_sales") top_regions = select(regional_sales.c.region).\ where( regional_sales.c.total_sales > select( func.sum(regional_sales.c.total_sales) / 10 ) ).cte("top_regions") statement = select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales") ).where(orders.c.region.in_( select(top_regions.c.region) )).group_by(orders.c.region, orders.c.product) result = conn.execute(statement).fetchall()
Пример 2, С РЕКУРСИВНЫМ:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() parts = Table('parts', metadata, Column('part', String), Column('sub_part', String), Column('quantity', Integer), ) included_parts = select(\ parts.c.sub_part, parts.c.part, parts.c.quantity\ ).\ where(parts.c.part=='our part').\ cte(recursive=True) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).\ where(parts_alias.c.part==incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity). label('total_quantity') ).\ group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
Пример 3, апсерт с использованием UPDATE и INSERT с CTE:
from datetime import date from sqlalchemy import (MetaData, Table, Column, Integer, Date, select, literal, and_, exists) metadata = MetaData() visitors = Table('visitors', metadata, Column('product_id', Integer, primary_key=True), Column('date', Date, primary_key=True), Column('count', Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where(and_(visitors.c.product_id == product_id, visitors.c.date == day)) .values(count=visitors.c.count + count) .returning(literal(1)) .cte('update_cte') ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)) .where(~exists(update_cte.select())) ) connection.execute(upsert)
Пример 4, Вложение CTE (SQLAlchemy 1.4.24 и выше):
value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a", nesting=True) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Приведенный выше запрос выведет второй CTE, вложенный в первый, показанный с инлайн-параметрами ниже как:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
Тот же CTE можно настроить с помощью метода
HasCTE.add_cte()
следующим образом (SQLAlchemy 2.0 и выше):value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n). add_cte(value_a_nested, nest_here=True). cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Пример 5, нелинейный CTE (SQLAlchemy 1.4.28 и выше):
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte( "nodes", recursive=True ) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
Приведенный выше запрос выведет 2 UNION внутри рекурсивного CTE:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
См.также
Query.cte()
- ORM-версияHasCTE.cte()
.
-
method
sqlalchemy.sql.expression.SelectBase.
exists() → Exists¶ Возвращает
Exists
представление этого selectable, которое может быть использовано как выражение столбца.Возвращаемый объект является экземпляром
Exists
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.SelectBase.
exported_columns¶ ColumnCollection
, который представляет «экспортированные» столбцы данногоSelectable
, не включая конструкцииTextClause
.«Экспортируемые» столбцы для объекта
SelectBase
являются синонимом коллекцииSelectBase.selected_columns
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.SelectBase.
get_label_style() → SelectLabelStyle¶ Получение текущего стиля этикетки.
Реализуется подклассами.
-
attribute
sqlalchemy.sql.expression.SelectBase.
inherit_cache: Optional[bool] = None¶ наследуется от
HasCacheKey.inherit_cache
атрибутаHasCacheKey
Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
sqlalchemy.sql.expression.SelectBase.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ наследуется от
ReturnsRows.is_derived_from()
методаReturnsRows
Возвращает
True
, если данныйReturnsRows
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.SelectBase.
label(name: Optional[str]) → Label[Any]¶ Возвращает «скалярное» представление этого selectable, встроенное в виде подзапроса с меткой.
См.также
-
method
sqlalchemy.sql.expression.SelectBase.
lateral(name: Optional[str] = None) → LateralFromClause¶ Возвращает ЛАТЕРАЛЬНЫЙ псевдоним данного
Selectable
.Возвращаемым значением является конструкция
Lateral
, также предоставляемая функцией верхнего уровняlateral()
.См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
-
method
sqlalchemy.sql.expression.SelectBase.
replace_selectable(old: FromClause, alias: Alias) → Self¶ наследуется от
Selectable.replace_selectable()
методаSelectable
Заменяет все вхождения
FromClause
„old“ на данный объектAlias
, возвращая копию этогоFromClause
.Не рекомендуется, начиная с версии 1.4: Метод
Selectable.replace_selectable()
является устаревшим и будет удален в одном из будущих выпусков. Аналогичная функциональность доступна через модуль sqlalchemy.sql.visitors.
-
method
sqlalchemy.sql.expression.SelectBase.
scalar_subquery() → ScalarSelect[Any]¶ Возвращает «скалярное» представление этого selectable, которое может быть использовано в качестве выражения столбца.
Возвращаемый объект является экземпляром
ScalarSelect
.Как правило, оператор select, имеющий только один столбец в пункте columns, может быть использован в качестве скалярного выражения. Затем скалярный подзапрос можно использовать в пункте WHERE или в пункте columns заключающего оператора SELECT.
Обратите внимание, что скалярный подзапрос отличается от подзапроса уровня FROM, который может быть получен с помощью метода
SelectBase.subquery()
.См.также
Скалярные и коррелированные подзапросы - в учебнике 2.0
-
method
sqlalchemy.sql.expression.SelectBase.
select(*arg: Any, **kw: Any) → Select¶ Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.select()
является устаревшим и будет удален в будущем выпуске; этот метод неявно создает подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем можно будет выбрать.
-
attribute
sqlalchemy.sql.expression.SelectBase.
selected_columns¶ ColumnCollection
, представляющий столбцы, которые данный оператор SELECT или аналогичная конструкция возвращает в свой набор результатов.Эта коллекция отличается от коллекции
FromClause.columns
FromClause
тем, что столбцы в этой коллекции не могут быть непосредственно вложены в другой оператор SELECT; сначала должен быть применен подзапрос, который обеспечивает необходимые скобки, требуемые SQL.Примечание
Коллекция
SelectBase.selected_columns
не включает выражения, установленные в предложении columns с помощью конструкцииtext()
; они молча опускаются из коллекции. Чтобы использовать обычные текстовые выражения столбцов внутри конструкцииSelect
, используйте конструкциюliteral_column()
.См.также
Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.SelectBase.
set_label_style(style: SelectLabelStyle) → Self¶ Возвращает новый selectable с указанным стилем метки.
Реализуется подклассами.
-
method
sqlalchemy.sql.expression.SelectBase.
subquery(name: Optional[str] = None) → Subquery¶ Возвращает подзапрос данного
SelectBase
.С точки зрения SQL подзапрос - это именованная конструкция со скобками, которая может быть помещена в предложение FROM другого оператора SELECT.
Учитывая оператор SELECT, такой как:
stmt = select(table.c.id, table.c.name)
Приведенное выше утверждение может выглядеть следующим образом:
SELECT table.id, table.name FROM table
Форма подзапроса сама по себе отображается таким же образом, однако при вставке в предложение FROM другого оператора SELECT она становится именованным подэлементом:
subq = stmt.subquery() new_stmt = select(subq)
Вышеуказанное переводится как:
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
Исторически,
SelectBase.subquery()
эквивалентен вызову методаFromClause.alias()
на объекте FROM; однако, поскольку объектSelectBase
не является непосредственно объектом FROM, методSelectBase.subquery()
обеспечивает более четкую семантику.Добавлено в версии 1.4.
-
method
- class sqlalchemy.sql.expression.Subquery¶
Представляет собой подзапрос SELECT.
Subquery
создается путем вызова методаSelectBase.subquery()
или, для удобства, методаSelectBase.alias()
на любом подклассеSelectBase
, который включаетSelect
,CompoundSelect
иTextualSelect
. Как отображается в предложении FROM, он представляет собой тело оператора SELECT внутри круглых скобок, за которыми следует обычное «AS <somename>», определяющее все объекты «alias».Объект
Subquery
очень похож на объектAlias
и может быть использован аналогичным образом. Разница междуAlias
иSubquery
заключается в том, чтоAlias
всегда содержит объектFromClause
, тогда какSubquery
всегда содержит объектSelectBase
.Добавлено в версии 1.4: Был добавлен класс
Subquery
, который теперь служит для обеспечения псевдослучайной версии оператора SELECT.Members
Классная подпись
класс
sqlalchemy.sql.expression.Subquery
(sqlalchemy.sql.expression.AliasedReturnsRows
)-
method
sqlalchemy.sql.expression.Subquery.
as_scalar() → ScalarSelect[Any]¶ Не рекомендуется, начиная с версии 1.4: Метод
Subquery.as_scalar()
, который ранее былAlias.as_scalar()
до версии 1.4, является устаревшим и будет удален в будущем выпуске; Пожалуйста, используйте методSelect.scalar_subquery()
конструкцииselect()
перед построением объекта подзапроса, или с помощью ORM используйте методQuery.scalar_subquery()
.
-
attribute
sqlalchemy.sql.expression.Subquery.
inherit_cache: Optional[bool] = True¶ Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
- class sqlalchemy.sql.expression.TableClause¶
Представляет собой минимальную конструкцию «таблицы».
Это легкий объект таблицы, который имеет только имя, набор столбцов, которые обычно создаются функцией
column()
, и схему:from sqlalchemy import table, column user = table("user", column("id"), column("name"), column("description"), )
Конструкция
TableClause
служит основой для более часто используемого объектаTable
, предоставляя обычный набор сервисовFromClause
, включая методы коллекции и генерации утверждений.c.
.Он *не предоставляет все дополнительные сервисы уровня схемы
Table
, включая ограничения, ссылки на другие таблицы или поддержку сервисов уровняMetaData
. Он полезен сам по себе как специальная конструкция, используемая для быстрой генерации SQL-запросов, когда под рукой нет более полноценногоTable
.Members
alias(), c, columns, compare(), compile(), corresponding_column(), delete(), description, entity_namespace, exported_columns, foreign_keys, get_children(), implicit_returning, inherit_cache, insert(), is_derived_from(), join(), lateral(), outerjoin(), params(), primary_key, replace_selectable(), schema, select(), self_group(), table_valued(), tablesample(), unique_params(), update()
Классная подпись
class
sqlalchemy.sql.expression.TableClause
(sqlalchemy.sql.roles.DMLTableRole
,sqlalchemy.sql.expression.Immutable
,sqlalchemy.sql.expression.NamedFromClause
)-
method
sqlalchemy.sql.expression.TableClause.
alias(name: Optional[str] = None, flat: bool = False) → NamedFromClause¶ наследуется от
FromClause.alias()
методаFromClause
Возвращает псевдоним данного
FromClause
.Например:
a2 = some_table.alias('a2')
Приведенный выше код создает объект
Alias
, который можно использовать как предложение FROM в любом операторе SELECT.
-
attribute
sqlalchemy.sql.expression.TableClause.
c¶ наследуется от
FromClause.c
атрибутаFromClause
Синоним для
FromClause.columns
- Результат:
-
attribute
sqlalchemy.sql.expression.TableClause.
columns¶ наследуется от
FromClause.columns
атрибутаFromClause
Коллекция объектов
ColumnElement
, поддерживаемых даннымFromClause
, основанная на именах.Коллекция
columns
, илиc
, является шлюзом для построения SQL-выражений, использующих столбцы, связанные с таблицей или другими выбираемыми столбцами:select(mytable).where(mytable.c.somecolumn == 5)
- Результат:
объект
ColumnCollection
.
-
method
sqlalchemy.sql.expression.TableClause.
compare(other: ClauseElement, **kw: Any) → bool¶ наследуется от
ClauseElement.compare()
методаClauseElement
Сравните это
ClauseElement
с заданнымClauseElement
.Подклассы должны переопределить поведение по умолчанию, которое представляет собой прямое сравнение идентичности.
**kw - это аргументы, потребляемые методами подкласса
compare()
и могут быть использованы для изменения критериев сравнения (см.ColumnElement
).
-
method
sqlalchemy.sql.expression.TableClause.
compile(bind: Optional[Union[Engine, Connection]] = None, dialect: Optional[Dialect] = None, **kw: Any) → Compiled¶ наследуется от
CompilerElement.compile()
методаCompilerElement
Составьте это SQL-выражение.
Возвращаемое значение представляет собой объект
Compiled
. Вызовstr()
илиunicode()
на возвращаемом значении даст строковое представление результата. ОбъектCompiled
также может возвращать словарь имен и значений параметров связывания, используя аксессорparams
.- Параметры:
bind – Параметр
Connection
илиEngine
, который может предоставитьDialect
для генерации объектаCompiled
. Если параметрыbind
иdialect
опущены, используется компилятор SQL по умолчанию.column_keys – Используется для операторов INSERT и UPDATE, список имен столбцов, которые должны присутствовать в предложении VALUES скомпилированного оператора. Если
None
, отображаются все столбцы из целевого объекта таблицы.dialect – Экземпляр
Dialect
, который может генерировать объектCompiled
. Этот аргумент имеет приоритет над аргументомbind
.compile_kwargs – необязательный словарь дополнительных параметров, которые будут передаваться компилятору во всех методах «visit». Это позволяет передавать любой пользовательский флаг, например, в пользовательскую конструкцию компиляции. Он также используется для случая передачи флага
literal_binds
:: from sqlalchemy.sql import table, column, select t = table(„t“, column(„x“)) s = select(t).where(t.c.x == 5) print(s.compile(compile_kwargs={«literal_binds»: True}))
-
method
sqlalchemy.sql.expression.TableClause.
corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → Optional[KeyedColumnElement[Any]]¶ наследуется от
Selectable.corresponding_column()
методаSelectable
Учитывая
ColumnElement
, возвращает экспортированный объектColumnElement
из коллекцииSelectable.exported_columns
данногоSelectable
, который соответствует исходномуColumnElement
через общий граф предков.- Параметры:
column – цель
ColumnElement
для сопоставления.require_embedded – возвращает соответствующие столбцы для данного
ColumnElement
только в том случае, если данныйColumnElement
действительно присутствует в подэлементе данногоSelectable
. Обычно столбец будет соответствовать, если он просто имеет общего предка с одним из экспортированных столбцов данногоSelectable
.
См.также
Selectable.exported_columns
-ColumnCollection
, который используется для операции.ColumnCollection.corresponding_column()
- метод реализации.
-
method
sqlalchemy.sql.expression.TableClause.
delete() → Delete¶ Сгенерируйте конструкцию
delete()
против данногоTableClause
.Например:
table.delete().where(table.c.id==7)
Информацию об аргументах и использовании см. в
delete()
.
-
attribute
sqlalchemy.sql.expression.TableClause.
description¶
-
attribute
sqlalchemy.sql.expression.TableClause.
entity_namespace¶ наследуется от
FromClause.entity_namespace
атрибутаFromClause
Возвращает пространство имен, используемое для доступа на основе имен в выражениях SQL.
Это пространство имен, которое используется для разрешения выражений типа «filter_by()», таких как:
stmt.filter_by(address='some address')
По умолчанию используется коллекция
.c
, однако внутренне ее можно переопределить с помощью аннотации «entity_namespace» для получения альтернативных результатов.
-
attribute
sqlalchemy.sql.expression.TableClause.
exported_columns¶ наследуется от
FromClause.exported_columns
атрибутаFromClause
ColumnCollection
, который представляет «экспортированные» столбцы данногоSelectable
.«Экспортируемые» столбцы для объекта
FromClause
являются синонимом коллекцииFromClause.columns
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.TableClause.
foreign_keys¶ наследуется от
FromClause.foreign_keys
атрибутаFromClause
Возвращает коллекцию объектов маркеров
ForeignKey
, на которые ссылается данный FromClause.Каждый
ForeignKey
является членомTable
широкогоForeignKeyConstraint
.См.также
-
method
sqlalchemy.sql.expression.TableClause.
get_children(*, omit_attrs: Tuple[str, ...] = (), **kw: Any) → Iterable[HasTraverseInternals]¶ наследуется от
HasTraverseInternals.get_children()
методаHasTraverseInternals
Возвращает непосредственные дочерние
HasTraverseInternals
элементы данногоHasTraverseInternals
.Используется для обхода посещений.
**kw может содержать флаги, изменяющие возвращаемую коллекцию, например, для возврата подмножества элементов, чтобы сократить время обхода, или для возврата дочерних элементов из другого контекста (например, коллекции на уровне схемы, а не на уровне пункта).
-
attribute
sqlalchemy.sql.expression.TableClause.
implicit_returning = False¶ TableClause
не поддерживает наличие первичного ключа или столбцов -уровня по умолчанию, поэтому неявное возвращение не применяется.
-
attribute
sqlalchemy.sql.expression.TableClause.
inherit_cache: Optional[bool] = None¶ наследуется от
HasCacheKey.inherit_cache
атрибутаHasCacheKey
Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
sqlalchemy.sql.expression.TableClause.
insert() → Insert¶ Сгенерируйте конструкцию
Insert
против данногоTableClause
.Например:
table.insert().values(name='foo')
Информацию об аргументах и использовании см. в
insert()
.
-
method
sqlalchemy.sql.expression.TableClause.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ наследуется от
FromClause.is_derived_from()
методаFromClause
Возвращает
True
, если данныйFromClause
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.TableClause.
join(right: _FromClauseArgument, onclause: Optional[_ColumnExpressionArgument[bool]] = None, isouter: bool = False, full: bool = False) → Join¶ наследуется от
FromClause.join()
методаFromClause
Возвращает
Join
из данногоFromClause
в другойFromClause
.Например:
from sqlalchemy import join j = user_table.join(address_table, user_table.c.id == address_table.c.user_id) stmt = select(user_table).select_from(j)
будет выдавать SQL примерно следующего содержания:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
- Параметры:
right – правая сторона соединения; это любой объект
FromClause
, например, объектTable
, а также может быть совместимым с selectable объектом, например, ORM-mapped class.onclause – выражение SQL, представляющее предложение ON для объединения. Если оставить значение
None
,FromClause.join()
попытается объединить две таблицы на основе отношения внешнего ключа.isouter – если True, отображает LEFT OUTER JOIN вместо JOIN.
full – если True, отображает FULL OUTER JOIN, вместо LEFT OUTER JOIN. Подразумевает
FromClause.join.isouter
.
-
method
sqlalchemy.sql.expression.TableClause.
lateral(name: Optional[str] = None) → LateralFromClause¶ наследуется от
Selectable.lateral()
методаSelectable
Возвращает ЛАТЕРАЛЬНЫЙ псевдоним данного
Selectable
.Возвращаемым значением является конструкция
Lateral
, также предоставляемая функцией верхнего уровняlateral()
.См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
-
method
sqlalchemy.sql.expression.TableClause.
outerjoin(right: _FromClauseArgument, onclause: Optional[_ColumnExpressionArgument[bool]] = None, full: bool = False) → Join¶ наследуется от
FromClause.outerjoin()
методаFromClause
Возвращает
Join
из данногоFromClause
в другойFromClause
, с флагом «isouter», установленным в True.Например:
from sqlalchemy import outerjoin j = user_table.outerjoin(address_table, user_table.c.id == address_table.c.user_id)
Вышесказанное эквивалентно:
j = user_table.join( address_table, user_table.c.id == address_table.c.user_id, isouter=True)
- Параметры:
right – правая сторона соединения; это любой объект
FromClause
, например, объектTable
, а также может быть совместимым с selectable объектом, например, ORM-mapped class.onclause – выражение SQL, представляющее предложение ON для объединения. Если оставить значение
None
,FromClause.join()
попытается объединить две таблицы на основе отношения внешнего ключа.full – если True, отображает ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ.
-
method
sqlalchemy.sql.expression.TableClause.
params(*optionaldict, **kwargs)¶ наследуется от
Immutable.params()
методаImmutable
Возвращает копию с замененными элементами
bindparam()
.Возвращает копию данного ClauseElement с элементами
bindparam()
, замененными значениями, взятыми из данного словаря:>>> clause = column('x') + bindparam('foo') >>> print(clause.compile().params) {'foo':None} >>> print(clause.params({'foo':7}).compile().params) {'foo':7}
-
attribute
sqlalchemy.sql.expression.TableClause.
primary_key¶ наследуется от
FromClause.primary_key
атрибутаFromClause
Возвращает итерируемую коллекцию объектов
Column
, составляющих первичный ключ данного_selectable.FromClause
.Для объекта
Table
эта коллекция представлена объектомPrimaryKeyConstraint
, который сам является итерируемой коллекцией объектовColumn
.
-
method
sqlalchemy.sql.expression.TableClause.
replace_selectable(old: FromClause, alias: Alias) → Self¶ наследуется от
Selectable.replace_selectable()
методаSelectable
Заменяет все вхождения
FromClause
„old“ на данный объектAlias
, возвращая копию этогоFromClause
.Не рекомендуется, начиная с версии 1.4: Метод
Selectable.replace_selectable()
является устаревшим и будет удален в одном из будущих выпусков. Аналогичная функциональность доступна через модуль sqlalchemy.sql.visitors.
-
attribute
sqlalchemy.sql.expression.TableClause.
schema: Optional[str] = None¶ наследуется от
FromClause.schema
атрибутаFromClause
Определите атрибут „schema“ для данного
FromClause
.Обычно это
None
для большинства объектов, за исключениемTable
, где оно принимается как значение аргументаTable.schema
.
-
method
sqlalchemy.sql.expression.TableClause.
select() → Select¶ наследуется от
FromClause.select()
методаFromClause
Возвращает SELECT данного
FromClause
.например:
stmt = some_table.select().where(some_table.c.id == 5)
См.также
select()
- метод общего назначения, позволяющий создавать произвольные списки столбцов.
-
method
sqlalchemy.sql.expression.TableClause.
self_group(against: Optional[OperatorType] = None) → ClauseElement¶ наследуется от
ClauseElement.self_group()
методаClauseElement
Примените «группировку» к этому
ClauseElement
.Этот метод переопределяется подклассами для возврата конструкции «группировки», т.е. круглой скобки. В частности, она используется «бинарными» выражениями для обеспечения группировки вокруг себя при помещении в более крупное выражение, а также конструкциями
select()
при помещении в предложение FROM другогоselect()
. (Обратите внимание, что подзапросы обычно следует создавать с помощью методаSelect.alias()
, поскольку многие платформы требуют, чтобы вложенные операторы SELECT были именованными).Поскольку выражения составляются вместе, применение
self_group()
происходит автоматически - код конечного пользователя никогда не должен использовать этот метод напрямую. Обратите внимание, что в конструкциях клаузул SQLAlchemy учитывается приоритет операторов - поэтому скобки могут не понадобиться, например, в выраженииx OR (y AND z)
- AND имеет приоритет над OR.Базовый метод
self_group()
ClauseElement
просто возвращает self.
-
method
sqlalchemy.sql.expression.TableClause.
table_valued() → TableValuedColumn[Any]¶ наследуется от
NamedFromClause.table_valued()
методаNamedFromClause
Возвращает объект
TableValuedColumn
для данногоFromClause
.TableValuedColumn
- этоColumnElement
, который представляет собой полную строку в таблице. Поддержка этой конструкции зависит от бэкенда и в различных формах поддерживается такими бэкендами, как PostgreSQL, Oracle и SQL Server.Например:
>>> from sqlalchemy import select, column, func, table >>> a = table("a", column("id"), column("x"), column("y")) >>> stmt = select(func.row_to_json(a.table_valued())) >>> print(stmt) {printsql}SELECT row_to_json(a) AS row_to_json_1 FROM a
Добавлено в версии 1.4.0b2.
-
method
sqlalchemy.sql.expression.TableClause.
tablesample(sampling: Union[float, Function[Any]], name: Optional[str] = None, seed: Optional[roles.ExpressionElementRole[Any]] = None) → TableSample¶ наследуется от
FromClause.tablesample()
методаFromClause
Возвращает псевдоним TABLESAMPLE данного
FromClause
.Возвращаемым значением является конструкция
TableSample
, также предоставляемая функцией верхнего уровняtablesample()
.См.также
tablesample()
- руководство по использованию и параметры
-
method
sqlalchemy.sql.expression.TableClause.
unique_params(*optionaldict, **kwargs)¶ наследуется от
Immutable.unique_params()
методаImmutable
Возвращает копию с замененными элементами
bindparam()
.Та же функциональность, что и
ClauseElement.params()
, за исключением добавления unique=True к параметрам привязки, чтобы можно было использовать несколько утверждений.
-
method
sqlalchemy.sql.expression.TableClause.
update() → Update¶ Сгенерируйте конструкцию
update()
против данногоTableClause
.Например:
table.update().where(table.c.id==7).values(name='foo')
Информацию об аргументах и использовании см. в
update()
.
-
method
- class sqlalchemy.sql.expression.TableSample¶
Представьте предложение TABLESAMPLE.
Этот объект строится из функции уровня модуля
tablesample()
, а также методаFromClause.tablesample()
, доступного для всех подклассовFromClause
.См.также
Классная подпись
класс
sqlalchemy.sql.expression.TableSample
(sqlalchemy.sql.expression.FromClauseAlias
)
- class sqlalchemy.sql.expression.TableValuedAlias¶
Псевдоним для «табличной» функции SQL.
Эта конструкция обеспечивает функцию SQL, которая возвращает столбцы для использования в предложении FROM оператора SELECT. Объект создается с помощью метода
FunctionElement.table_valued()
, например:>>> from sqlalchemy import select, func >>> fn = func.json_array_elements_text('["one", "two", "three"]').table_valued("value") >>> print(select(fn.c.value)) {printsql}SELECT anon_1.value FROM json_array_elements_text(:json_array_elements_text_1) AS anon_1
Добавлено в версии 1.4.0b2.
Members
Классная подпись
класс
sqlalchemy.sql.expression.TableValuedAlias
(sqlalchemy.sql.expression.LateralFromClause
,sqlalchemy.sql.expression.Alias
)-
method
sqlalchemy.sql.expression.TableValuedAlias.
alias(name: Optional[str] = None, flat: bool = False) → TableValuedAlias¶ Возвращает новый псевдоним данного
TableValuedAlias
.Это создает отдельный объект FROM, который будет отличаться от исходного при использовании в операторе SQL.
-
attribute
sqlalchemy.sql.expression.TableValuedAlias.
column¶ Возвращает выражение столбца, представляющее данный
TableValuedAlias
.Этот аксессор используется для реализации метода
FunctionElement.column_valued()
. Более подробную информацию см. в этом методе.Например:
>>> print(select(func.some_func().table_valued("value").column)) {printsql}SELECT anon_1 FROM some_func() AS anon_1
См.также
-
method
sqlalchemy.sql.expression.TableValuedAlias.
lateral(name: Optional[str] = None) → LateralFromClause¶ Возвращает новый
TableValuedAlias
с установленным флагом lateral, чтобы он отображался как LATERAL.См.также
-
method
sqlalchemy.sql.expression.TableValuedAlias.
render_derived(name: Optional[str] = None, with_types: bool = False) → TableValuedAlias¶ Примените «render derived» к этому
TableValuedAlias
.Это приводит к тому, что имена отдельных столбцов перечисляются после имени псевдонима в последовательности «AS», например:
>>> print( ... select( ... func.unnest(array(["one", "two", "three"])). table_valued("x", with_ordinality="o").render_derived() ... ) ... ) {printsql}SELECT anon_1.x, anon_1.o FROM unnest(ARRAY[%(param_1)s, %(param_2)s, %(param_3)s]) WITH ORDINALITY AS anon_1(x, o)
Ключевое слово
with_types
будет выводить типы столбцов в строку в выражении псевдонима (этот синтаксис в настоящее время применяется к базе данных PostgreSQL):>>> print( ... select( ... func.json_to_recordset( ... '[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]' ... ) ... .table_valued(column("a", Integer), column("b", String)) ... .render_derived(with_types=True) ... ) ... ) {printsql}SELECT anon_1.a, anon_1.b FROM json_to_recordset(:json_to_recordset_1) AS anon_1(a INTEGER, b VARCHAR)
- Параметры:
name – необязательное строковое имя, которое будет применяться к создаваемому псевдониму. Если оставить значение None, будет использоваться уникальное анонимизирующее имя.
with_types – если True, производные столбцы будут включать спецификацию типа данных с каждым столбцом. Это специальный синтаксис, который, как известно, в настоящее время требуется PostgreSQL для некоторых функций SQL.
-
method
- class sqlalchemy.sql.expression.TextualSelect¶
Оберните конструкцию
TextClause
внутри интерфейсаSelectBase
.Это позволяет объекту
TextClause
получить коллекцию.c
и другие FROM-подобные возможности, такие какFromClause.alias()
,SelectBase.cte()
и т.д.Конструкция
TextualSelect
создается с помощью методаTextClause.columns()
- подробности см. в этом методе.Изменено в версии 1.4: класс
TextualSelect
был переименован изTextAsFrom
, чтобы более точно соответствовать его роли как объекта, ориентированного на SELECT, а не на предложение FROM.Members
add_cte(), alias(), as_scalar(), c, compare(), compile(), corresponding_column(), cte(), execution_options(), exists(), exported_columns, get_children(), get_execution_options(), get_label_style(), inherit_cache, is_derived_from(), label(), lateral(), options(), params(), replace_selectable(), scalar_subquery(), select(), selected_columns, self_group(), set_label_style(), subquery(), unique_params()
Классная подпись
class
sqlalchemy.sql.expression.TextualSelect
(sqlalchemy.sql.expression.SelectBase
,sqlalchemy.sql.expression.ExecutableReturnsRows
,sqlalchemy.sql.expression.Generative
)-
method
sqlalchemy.sql.expression.TextualSelect.
add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ наследуется от
HasCTE.add_cte()
методаHasCTE
Добавьте к этому утверждению одну или несколько конструкций
CTE
.Этот метод свяжет заданные конструкции
CTE
с родительским оператором таким образом, что каждая из них будет безоговорочно отображена в предложение WITH конечного оператора, даже если на нее нет ссылок в других местах оператора или вложенных селектов.Необязательный параметр
HasCTE.add_cte.nest_here
при установке в True будет иметь тот эффект, что каждый данныйCTE
будет отображаться в предложении WITH, отображаемом непосредственно вместе с этим утверждением, а не перемещаться в начало конечного отображаемого утверждения, даже если это утверждение отображается как подзапрос внутри более крупного утверждения.Этот метод имеет два общих применения. Первое - это встраивание операторов CTE, которые служат некоторым целям без явных ссылок, например, в случае встраивания оператора DML, такого как INSERT или UPDATE, в качестве CTE в линию с основным оператором, который может косвенно использовать его результаты. Другая задача - обеспечить контроль над точным размещением определенной серии конструкций CTE, которые должны оставаться отображенными непосредственно в терминах конкретного оператора, который может быть вложен в более крупный оператор.
Например:
from sqlalchemy import table, column, select t = table('t', column('c1'), column('c2')) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
Будет оказывать:
WITH anon_1 AS (INSERT INTO t (c1, c2) VALUES (:param_1, :param_2)) SELECT t.c1, t.c2 FROM t
Выше, CTE «anon_1» не упоминается в операторе SELECT, но все же выполняет задачу запуска оператора INSERT.
Аналогично в контексте, связанном с DML, использование конструкции PostgreSQL
Insert
для создания «upsert»:from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = ( t.delete().where(t.c.c1 < 1).cte("deletions") ) insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
Вышеприведенное утверждение выглядит следующим образом:
WITH deletions AS (DELETE FROM t WHERE t.c1 < %(c1_1)s) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
Добавлено в версии 1.4.21.
- Параметры:
*ctes – ноль или более конструкций
CTE
. … versionchanged:: 2.0 Принимаются несколько экземпляров CTEnest_here – если True, то данный CTE или CTE будут отображаться так, как если бы при добавлении их в данный
HasCTE
был указан флагHasCTE.cte.nesting
вTrue
. Если предполагается, что на данные CTE не ссылаются во внешнем охватывающем утверждении, то при установке этого флага данные CTE будут отображаться на уровне этого утверждения. … версия добавлена:: 2.0 .. seealso::HasCTE.cte.nesting
-
method
sqlalchemy.sql.expression.TextualSelect.
alias(name: Optional[str] = None, flat: bool = False) → Subquery¶ наследуется от
SelectBase.alias()
методаSelectBase
Возвращает именованный подзапрос к данному
SelectBase
.Для
SelectBase
(в отличие отFromClause
) это возвращает объектSubquery
, который ведет себя в основном так же, как объектAlias
, который используется сFromClause
.Изменено в версии 1.4: Метод
SelectBase.alias()
теперь является синонимом методаSelectBase.subquery()
.
-
method
sqlalchemy.sql.expression.TextualSelect.
as_scalar() → ScalarSelect[Any]¶ наследуется от
SelectBase.as_scalar()
методаSelectBase
Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.as_scalar()
является устаревшим и будет удален в одном из будущих выпусков. Пожалуйста, обратитесь кSelectBase.scalar_subquery()
.
-
attribute
sqlalchemy.sql.expression.TextualSelect.
c¶ наследуется от
SelectBase.c
атрибутаSelectBase
Не рекомендуется, начиная с версии 1.4: Атрибуты
SelectBase.c
иSelectBase.columns
устарели и будут удалены в будущем релизе; эти атрибуты неявно создают подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем будет содержать этот атрибут. Для доступа к столбцам, из которых выбирает данный объект SELECT, используйте атрибутSelectBase.selected_columns
.
-
method
sqlalchemy.sql.expression.TextualSelect.
compare(other: ClauseElement, **kw: Any) → bool¶ наследуется от
ClauseElement.compare()
методаClauseElement
Сравните это
ClauseElement
с заданнымClauseElement
.Подклассы должны переопределить поведение по умолчанию, которое представляет собой прямое сравнение идентичности.
**kw - это аргументы, потребляемые методами подкласса
compare()
и могут быть использованы для изменения критериев сравнения (см.ColumnElement
).
-
method
sqlalchemy.sql.expression.TextualSelect.
compile(bind: Optional[Union[Engine, Connection]] = None, dialect: Optional[Dialect] = None, **kw: Any) → Compiled¶ наследуется от
CompilerElement.compile()
методаCompilerElement
Составьте это SQL-выражение.
Возвращаемое значение представляет собой объект
Compiled
. Вызовstr()
илиunicode()
на возвращаемом значении даст строковое представление результата. ОбъектCompiled
также может возвращать словарь имен и значений параметров связывания, используя аксессорparams
.- Параметры:
bind – Параметр
Connection
илиEngine
, который может предоставитьDialect
для генерации объектаCompiled
. Если параметрыbind
иdialect
опущены, используется компилятор SQL по умолчанию.column_keys – Используется для операторов INSERT и UPDATE, список имен столбцов, которые должны присутствовать в предложении VALUES скомпилированного оператора. Если
None
, отображаются все столбцы из целевого объекта таблицы.dialect – Экземпляр
Dialect
, который может генерировать объектCompiled
. Этот аргумент имеет приоритет над аргументомbind
.compile_kwargs – необязательный словарь дополнительных параметров, которые будут передаваться компилятору во всех методах «visit». Это позволяет передавать любой пользовательский флаг, например, в пользовательскую конструкцию компиляции. Он также используется для случая передачи флага
literal_binds
:: from sqlalchemy.sql import table, column, select t = table(„t“, column(„x“)) s = select(t).where(t.c.x == 5) print(s.compile(compile_kwargs={«literal_binds»: True}))
-
method
sqlalchemy.sql.expression.TextualSelect.
corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → Optional[KeyedColumnElement[Any]]¶ наследуется от
Selectable.corresponding_column()
методаSelectable
Учитывая
ColumnElement
, возвращает экспортированный объектColumnElement
из коллекцииSelectable.exported_columns
данногоSelectable
, который соответствует исходномуColumnElement
через общий граф предков.- Параметры:
column – цель
ColumnElement
для сопоставления.require_embedded – возвращает соответствующие столбцы для данного
ColumnElement
только в том случае, если данныйColumnElement
действительно присутствует в подэлементе данногоSelectable
. Обычно столбец будет соответствовать, если он просто имеет общего предка с одним из экспортированных столбцов данногоSelectable
.
См.также
Selectable.exported_columns
-ColumnCollection
, который используется для операции.ColumnCollection.corresponding_column()
- метод реализации.
-
method
sqlalchemy.sql.expression.TextualSelect.
cte(name: Optional[str] = None, recursive: bool = False, nesting: bool = False) → CTE¶ наследуется от
HasCTE.cte()
методаHasCTE
Возвращает новый экземпляр
CTE
, или Common Table Expression.Общие табличные выражения - это стандарт SQL, согласно которому операторы SELECT могут использовать вторичные операторы, указанные вместе с первичным оператором, используя предложение под названием «WITH». Специальная семантика UNION также может быть использована для обеспечения «рекурсивных» запросов, когда оператор SELECT может использовать набор строк, которые были выбраны ранее.
CTE также могут применяться к конструкциям DML UPDATE, INSERT и DELETE в некоторых базах данных, как в качестве источника строк CTE в сочетании с RETURNING, так и в качестве потребителя строк CTE.
SQLAlchemy определяет объекты
CTE
, которые рассматриваются аналогично объектамAlias
, как специальные элементы, которые должны быть доставлены в предложение FROM оператора, а также в предложение WITH в верхней части оператора.Для специальных префиксов, таких как PostgreSQL «MATERIALIZED» и «NOT MATERIALIZED», можно использовать метод
CTE.prefix_with()
для их установления.Изменено в версии 1.3.13: Добавлена поддержка префиксов. В частности - МАТЕРИАЛИЗОВАННЫЙ и НЕ МАТЕРИАЛИЗОВАННЫЙ.
- Параметры:
name – имя, присваиваемое общему табличному выражению. Как и
FromClause.alias()
, имя может быть оставлено какNone
, в этом случае во время компиляции запроса будет использоваться анонимный символ.recursive – если
True
, будет отображатьсяWITH RECURSIVE
. Рекурсивное выражение общей таблицы предназначено для использования в сочетании с UNION ALL, чтобы вывести строки из уже выбранных.nesting – если
True
, то CTE будет отображаться локально в операторе, в котором на него ссылаются. Для более сложных сценариев можно также использовать методHasCTE.add_cte()
с параметромHasCTE.add_cte.nest_here
для более тщательного контроля точного размещения конкретного CTE. … версия добавлена:: 1.4.24 .. seealso::HasCTE.add_cte()
Ниже приведены два примера из документации PostgreSQL по адресу https://www.postgresql.org/docs/current/static/queries-with.html, а также дополнительные примеры.
Пример 1, нерекурсивный:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() orders = Table('orders', metadata, Column('region', String), Column('amount', Integer), Column('product', String), Column('quantity', Integer) ) regional_sales = select( orders.c.region, func.sum(orders.c.amount).label('total_sales') ).group_by(orders.c.region).cte("regional_sales") top_regions = select(regional_sales.c.region).\ where( regional_sales.c.total_sales > select( func.sum(regional_sales.c.total_sales) / 10 ) ).cte("top_regions") statement = select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales") ).where(orders.c.region.in_( select(top_regions.c.region) )).group_by(orders.c.region, orders.c.product) result = conn.execute(statement).fetchall()
Пример 2, С РЕКУРСИВНЫМ:
from sqlalchemy import (Table, Column, String, Integer, MetaData, select, func) metadata = MetaData() parts = Table('parts', metadata, Column('part', String), Column('sub_part', String), Column('quantity', Integer), ) included_parts = select(\ parts.c.sub_part, parts.c.part, parts.c.quantity\ ).\ where(parts.c.part=='our part').\ cte(recursive=True) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).\ where(parts_alias.c.part==incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity). label('total_quantity') ).\ group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
Пример 3, апсерт с использованием UPDATE и INSERT с CTE:
from datetime import date from sqlalchemy import (MetaData, Table, Column, Integer, Date, select, literal, and_, exists) metadata = MetaData() visitors = Table('visitors', metadata, Column('product_id', Integer, primary_key=True), Column('date', Date, primary_key=True), Column('count', Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where(and_(visitors.c.product_id == product_id, visitors.c.date == day)) .values(count=visitors.c.count + count) .returning(literal(1)) .cte('update_cte') ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)) .where(~exists(update_cte.select())) ) connection.execute(upsert)
Пример 4, Вложение CTE (SQLAlchemy 1.4.24 и выше):
value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a", nesting=True) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Приведенный выше запрос выведет второй CTE, вложенный в первый, показанный с инлайн-параметрами ниже как:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
Тот же CTE можно настроить с помощью метода
HasCTE.add_cte()
следующим образом (SQLAlchemy 2.0 и выше):value_a = select( literal("root").label("n") ).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select( literal("nesting").label("n") ).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n). add_cte(value_a_nested, nest_here=True). cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
Пример 5, нелинейный CTE (SQLAlchemy 1.4.28 и выше):
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte( "nodes", recursive=True ) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
Приведенный выше запрос выведет 2 UNION внутри рекурсивного CTE:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
См.также
Query.cte()
- ORM-версияHasCTE.cte()
.
-
method
sqlalchemy.sql.expression.TextualSelect.
execution_options(**kw: Any) → Self¶ наследуется от
Executable.execution_options()
методаExecutable
Установите для оператора параметры, не относящиеся к SQL, которые вступают в силу во время выполнения.
Параметры выполнения могут быть установлены в различных масштабах, в том числе на запрос, на соединение или на выполнение, с помощью таких методов, как
Connection.execution_options()
и параметров, которые принимают словарь параметров, таких какConnection.execute.execution_options
иSession.execute.execution_options
.Основной характеристикой опции выполнения, в отличие от других видов опций, таких как опции загрузчика ORM, является то, что опции выполнения никогда не влияют на скомпилированный SQL запроса, только на то, что влияет на то, как вызывается сам SQL-запрос или как извлекаются результаты. То есть опции выполнения не являются частью того, что учитывается при компиляции SQL, и не считаются частью кэшированного состояния оператора.
Метод
Executable.execution_options()
является generative, как и в случае применения метода к объектамEngine
иQuery
, что означает, что при вызове метода возвращается копия объекта, которая применяет заданные параметры к этой новой копии, но оставляет оригинал неизменным:statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
Исключением из этого поведения является объект
Connection
, где методConnection.execution_options()
явно не генеративный.Типы параметров, которые могут быть переданы в
Executable.execution_options()
и другие связанные методы и словари параметров, включают параметры, которые явно потребляются SQLAlchemy Core или ORM, а также произвольные аргументы ключевых слов, не определенные SQLAlchemy, что означает, что методы и/или словари параметров могут использоваться для определяемых пользователем параметров, которые взаимодействуют с пользовательским кодом, который может обращаться к параметрам с помощью таких методов, какExecutable.get_execution_options()
иConnection.get_execution_options()
, или в рамках выбранных крючков событий с помощью специального параметра событияexecution_options
, такого какConnectionEvents.before_execute.execution_options
илиORMExecuteState.execution_options
, например. g.:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
В рамках опций, которые явно распознаются SQLAlchemy, большинство из них применяются к определенным классам объектов, а не к другим. К наиболее распространенным опциям выполнения относятся:
Connection.execution_options.isolation_level
- устанавливает уровень изоляции для соединения или класса соединений черезEngine
. Этот параметр принимается толькоConnection
илиEngine
.Connection.execution_options.stream_results
- указывает, что результаты должны быть получены с помощью курсора на стороне сервера; эта опция принимаетсяConnection
, параметромConnection.execute.execution_options
наConnection.execute()
, и дополнительноExecutable.execution_options()
на объекте оператора SQL, а также конструкциями ORM, такими какSession.execute()
.Connection.execution_options.compiled_cache
- указывает словарь, который будет служить SQL compilation cache дляConnection
илиEngine
, а также для методов ORM, таких какSession.execute()
. Может быть передан какNone
, чтобы отключить кэширование для утверждений. Эта опция не принимаетсяExecutable.execution_options()
, поскольку нежелательно переносить кэш компиляции внутри объекта statement.Connection.execution_options.schema_translate_map
- отображение имен схем, используемых функцией Schema Translate Map, принимаемых функциямиConnection
,Engine
,Executable
, а также конструкциями ORM, такими какSession.execute()
.
См.также
Connection.execution_options()
Connection.execute.execution_options
Session.execute.execution_options
Варианты выполнения ORM - документация по всем специфическим для ORM опциям исполнения
-
method
sqlalchemy.sql.expression.TextualSelect.
exists() → Exists¶ наследуется от
SelectBase.exists()
методаSelectBase
Возвращает
Exists
представление этого selectable, которое может быть использовано как выражение столбца.Возвращаемый объект является экземпляром
Exists
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.TextualSelect.
exported_columns¶ наследуется от
SelectBase.exported_columns
атрибутаSelectBase
ColumnCollection
, который представляет «экспортированные» столбцы данногоSelectable
, не включая конструкцииTextClause
.«Экспортируемые» столбцы для объекта
SelectBase
являются синонимом коллекцииSelectBase.selected_columns
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.TextualSelect.
get_children(*, omit_attrs: Tuple[str, ...] = (), **kw: Any) → Iterable[HasTraverseInternals]¶ наследуется от
HasTraverseInternals.get_children()
методаHasTraverseInternals
Возвращает непосредственные дочерние
HasTraverseInternals
элементы данногоHasTraverseInternals
.Используется для обхода посещений.
**kw может содержать флаги, изменяющие возвращаемую коллекцию, например, для возврата подмножества элементов, чтобы сократить время обхода, или для возврата дочерних элементов из другого контекста (например, коллекции на уровне схемы, а не на уровне пункта).
-
method
sqlalchemy.sql.expression.TextualSelect.
get_execution_options() → _ExecuteOptions¶ наследуется от
Executable.get_execution_options()
методаExecutable
Получить параметры, не относящиеся к SQL, которые будут действовать во время выполнения.
Добавлено в версии 1.3.
См.также
-
method
sqlalchemy.sql.expression.TextualSelect.
get_label_style() → SelectLabelStyle¶ наследуется от
SelectBase.get_label_style()
методаSelectBase
Получение текущего стиля этикетки.
Реализуется подклассами.
-
attribute
sqlalchemy.sql.expression.TextualSelect.
inherit_cache: Optional[bool] = None¶ наследуется от
HasCacheKey.inherit_cache
атрибутаHasCacheKey
Укажите, должен ли данный экземпляр
HasCacheKey
использовать схему генерации ключей кэша, используемую его непосредственным суперклассом.По умолчанию атрибут имеет значение
None
, что указывает на то, что конструкция еще не приняла во внимание целесообразность ее участия в кэшировании; функционально это эквивалентно установке значенияFalse
, за исключением того, что при этом выдается предупреждение.Этот флаг может быть установлен в
True
на определенном классе, если SQL, соответствующий объекту, не изменяется на основе атрибутов, локальных для этого класса, а не его суперкласса.См.также
Включение поддержки кэширования для пользовательских конструкций - общие направляющие для установки атрибута
HasCacheKey.inherit_cache
для сторонних или определенных пользователем конструкций SQL.
-
method
sqlalchemy.sql.expression.TextualSelect.
is_derived_from(fromclause: Optional[FromClause]) → bool¶ наследуется от
ReturnsRows.is_derived_from()
методаReturnsRows
Возвращает
True
, если данныйReturnsRows
является «производным» от данногоFromClause
.Например, псевдоним таблицы является производным от этой таблицы.
-
method
sqlalchemy.sql.expression.TextualSelect.
label(name: Optional[str]) → Label[Any]¶ наследуется от
SelectBase.label()
методаSelectBase
Возвращает «скалярное» представление этого selectable, встроенное в виде подзапроса с меткой.
См.также
-
method
sqlalchemy.sql.expression.TextualSelect.
lateral(name: Optional[str] = None) → LateralFromClause¶ наследуется от
SelectBase.lateral()
методаSelectBase
Возвращает ЛАТЕРАЛЬНЫЙ псевдоним данного
Selectable
.Возвращаемым значением является конструкция
Lateral
, также предоставляемая функцией верхнего уровняlateral()
.См.также
ЛАТЕРАЛЬНАЯ корреляция - обзор использования.
-
method
sqlalchemy.sql.expression.TextualSelect.
options(*options: ExecutableOption) → Self¶ наследуется от
Executable.options()
методаExecutable
Примените варианты к этому утверждению.
В общем смысле опции - это любой вид объекта Python, который может быть интерпретирован компилятором SQL для оператора. Эти опции могут потребляться конкретными диалектами или конкретными видами компиляторов.
Наиболее известным видом опций являются опции уровня ORM, которые применяют «жаждущую загрузку» и другие способы загрузки к запросам ORM. Однако теоретически опции могут использоваться и для многих других целей.
Для получения информации о конкретных видах опций для конкретных видов утверждений, обратитесь к документации для этих объектов опций.
Изменено в версии 1.4: - added
Executable.options()
to Core statement objects towards the goal of allowing unified Core / ORM querying capabilities.См.также
Варианты загрузки колонн - относится к опциям, специфичным для использования ORM-запросов
Загрузка отношений с помощью опций загрузчика - относится к опциям, специфичным для использования ORM-запросов
-
method
sqlalchemy.sql.expression.TextualSelect.
params(_ClauseElement__optionaldict: Optional[Mapping[str, Any]] = None, **kwargs: Any) → Self¶ наследуется от
ClauseElement.params()
методаClauseElement
Возвращает копию с замененными элементами
bindparam()
.Возвращает копию данного ClauseElement с элементами
bindparam()
, замененными значениями, взятыми из данного словаря:>>> clause = column('x') + bindparam('foo') >>> print(clause.compile().params) {'foo':None} >>> print(clause.params({'foo':7}).compile().params) {'foo':7}
-
method
sqlalchemy.sql.expression.TextualSelect.
replace_selectable(old: FromClause, alias: Alias) → Self¶ наследуется от
Selectable.replace_selectable()
методаSelectable
Заменяет все вхождения
FromClause
„old“ на данный объектAlias
, возвращая копию этогоFromClause
.Не рекомендуется, начиная с версии 1.4: Метод
Selectable.replace_selectable()
является устаревшим и будет удален в одном из будущих выпусков. Аналогичная функциональность доступна через модуль sqlalchemy.sql.visitors.
-
method
sqlalchemy.sql.expression.TextualSelect.
scalar_subquery() → ScalarSelect[Any]¶ наследуется от
SelectBase.scalar_subquery()
методаSelectBase
Возвращает «скалярное» представление этого selectable, которое может быть использовано в качестве выражения столбца.
Возвращаемый объект является экземпляром
ScalarSelect
.Как правило, оператор select, имеющий только один столбец в пункте columns, может быть использован в качестве скалярного выражения. Затем скалярный подзапрос можно использовать в пункте WHERE или в пункте columns заключающего оператора SELECT.
Обратите внимание, что скалярный подзапрос отличается от подзапроса уровня FROM, который может быть получен с помощью метода
SelectBase.subquery()
.См.также
Скалярные и коррелированные подзапросы - в учебнике 2.0
-
method
sqlalchemy.sql.expression.TextualSelect.
select(*arg: Any, **kw: Any) → Select¶ наследуется от
SelectBase.select()
методаSelectBase
Не рекомендуется, начиная с версии 1.4: Метод
SelectBase.select()
является устаревшим и будет удален в будущем выпуске; этот метод неявно создает подзапрос, который должен быть явным. Пожалуйста, сначала вызовитеSelectBase.subquery()
, чтобы создать подзапрос, который затем можно будет выбрать.
-
attribute
sqlalchemy.sql.expression.TextualSelect.
selected_columns¶ ColumnCollection
, представляющий столбцы, которые данный оператор SELECT или аналогичная конструкция возвращает в свой набор результатов, не включая конструкцииTextClause
.Эта коллекция отличается от коллекции
FromClause.columns
FromClause
тем, что столбцы в этой коллекции не могут быть непосредственно вложены в другой оператор SELECT; сначала должен быть применен подзапрос, который обеспечивает необходимые скобки, требуемые SQL.Для конструкции
TextualSelect
коллекция содержит объектыColumnElement
, которые были переданы конструктору, обычно через методTextClause.columns()
.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.TextualSelect.
self_group(against: Optional[OperatorType] = None) → ClauseElement¶ наследуется от
ClauseElement.self_group()
методаClauseElement
Примените «группировку» к этому
ClauseElement
.Этот метод переопределяется подклассами для возврата конструкции «группировки», т.е. круглой скобки. В частности, она используется «бинарными» выражениями для обеспечения группировки вокруг себя при помещении в более крупное выражение, а также конструкциями
select()
при помещении в предложение FROM другогоselect()
. (Обратите внимание, что подзапросы обычно следует создавать с помощью методаSelect.alias()
, поскольку многие платформы требуют, чтобы вложенные операторы SELECT были именованными).Поскольку выражения составляются вместе, применение
self_group()
происходит автоматически - код конечного пользователя никогда не должен использовать этот метод напрямую. Обратите внимание, что в конструкциях клаузул SQLAlchemy учитывается приоритет операторов - поэтому скобки могут не понадобиться, например, в выраженииx OR (y AND z)
- AND имеет приоритет над OR.Базовый метод
self_group()
ClauseElement
просто возвращает self.
-
method
sqlalchemy.sql.expression.TextualSelect.
set_label_style(style: SelectLabelStyle) → TextualSelect¶ Возвращает новый selectable с указанным стилем метки.
Реализуется подклассами.
-
method
sqlalchemy.sql.expression.TextualSelect.
subquery(name: Optional[str] = None) → Subquery¶ наследуется от
SelectBase.subquery()
методаSelectBase
Возвращает подзапрос данного
SelectBase
.С точки зрения SQL подзапрос - это именованная конструкция со скобками, которая может быть помещена в предложение FROM другого оператора SELECT.
Учитывая оператор SELECT, такой как:
stmt = select(table.c.id, table.c.name)
Приведенное выше утверждение может выглядеть следующим образом:
SELECT table.id, table.name FROM table
Форма подзапроса сама по себе отображается таким же образом, однако при вставке в предложение FROM другого оператора SELECT она становится именованным подэлементом:
subq = stmt.subquery() new_stmt = select(subq)
Вышеуказанное переводится как:
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
Исторически,
SelectBase.subquery()
эквивалентен вызову методаFromClause.alias()
на объекте FROM; однако, поскольку объектSelectBase
не является непосредственно объектом FROM, методSelectBase.subquery()
обеспечивает более четкую семантику.Добавлено в версии 1.4.
-
method
sqlalchemy.sql.expression.TextualSelect.
unique_params(_ClauseElement__optionaldict: Optional[Dict[str, Any]] = None, **kwargs: Any) → Self¶ наследуется от
ClauseElement.unique_params()
методаClauseElement
Возвращает копию с замененными элементами
bindparam()
.Та же функциональность, что и
ClauseElement.params()
, за исключением добавления unique=True к параметрам привязки, чтобы можно было использовать несколько утверждений.
-
method
- class sqlalchemy.sql.expression.Values¶
Представляет собой конструкцию
VALUES
, которая может быть использована в качестве элемента FROM в операторе.Объект
Values
создается из функцииvalues()
.Добавлено в версии 1.4.
Members
Классная подпись
class
sqlalchemy.sql.expression.Values
(sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.expression.Generative
,sqlalchemy.sql.expression.LateralFromClause
)-
method
sqlalchemy.sql.expression.Values.
alias(name: Optional[str] = None, flat: bool = False) → Self¶ Возвращает новую конструкцию
Values
, которая является копией данной с заданным именем.Этот метод является специфической для VALUES специализацией метода
FromClause.alias()
.
-
method
sqlalchemy.sql.expression.Values.
data(values: List[Tuple[Any, ...]]) → Self¶ Возвращает новую конструкцию
Values
, добавляя заданные данные в список данных.Например:
my_values = my_values.data([(1, 'value 1'), (2, 'value2')])
- Параметры:
values – последовательность (т.е. список) кортежей, которые отображаются на выражения столбцов, заданные в конструкторе
Values
.
-
method
sqlalchemy.sql.expression.Values.
lateral(name: Optional[str] = None) → LateralFromClause¶ Возвращает новый
Values
с установленным флагом lateral, чтобы он отображался как LATERAL.См.также
-
method
sqlalchemy.sql.expression.Values.
scalar_values() → ScalarValues¶ Возвращает скалярную конструкцию
VALUES
, которая может быть использована в качестве элемента COLUMN в операторе.Добавлено в версии 2.0.0b4.
-
method
- class sqlalchemy.sql.expression.ScalarValues¶
Представляет собой скалярную конструкцию
VALUES
, которая может быть использована в качестве элемента COLUMN в операторе.Объект
ScalarValues
создается из методаValues.scalar_values()
. Он также автоматически создается, когдаValues
используется вIN
илиNOT IN
условии.Добавлено в версии 2.0.0b4.
Классная подпись
class
sqlalchemy.sql.expression.ScalarValues
(sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.expression.GroupedElement
,sqlalchemy.sql.expression.ColumnElement
)
Константы стиля этикетки¶
Константы, используемые с методом GenerativeSelect.set_label_style()
.
Object Name | Description |
---|---|
Константы стиля этикетки, которые могут быть переданы в |
- class sqlalchemy.sql.expression.SelectLabelStyle¶
Константы стиля этикетки, которые могут быть переданы в
Select.set_label_style()
.Members
LABEL_STYLE_DEFAULT, LABEL_STYLE_DISAMBIGUATE_ONLY, LABEL_STYLE_NONE, LABEL_STYLE_TABLENAME_PLUS_COL
Классная подпись
класс
sqlalchemy.sql.expression.SelectLabelStyle
(enum.Enum
)-
attribute
sqlalchemy.sql.expression.SelectLabelStyle.
LABEL_STYLE_DEFAULT = 2¶ Стиль метки по умолчанию, относится к
LABEL_STYLE_DISAMBIGUATE_ONLY
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.SelectLabelStyle.
LABEL_STYLE_DISAMBIGUATE_ONLY = 2¶ Стиль метки, указывающий, что столбцы с именем, конфликтующим с существующим именем, должны быть помечены полуанонимизирующей меткой при генерации пункта columns оператора SELECT.
Ниже большинство имен столбцов остаются незатронутыми, за исключением второго вхождения имени
columna
, которое помечено меткойcolumna_1
, чтобы отличить его от имениtablea.columna
:>>> from sqlalchemy import table, column, select, true, LABEL_STYLE_DISAMBIGUATE_ONLY >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_DISAMBIGUATE_ONLY)) {printsql}SELECT table1.columna, table1.columnb, table2.columna AS columna_1, table2.columnc FROM table1 JOIN table2 ON true
Используется с методом
GenerativeSelect.set_label_style()
,LABEL_STYLE_DISAMBIGUATE_ONLY
является стилем маркировки по умолчанию для всех операторов SELECT за пределами запросов ORM 1.x style.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.SelectLabelStyle.
LABEL_STYLE_NONE = 0¶ Стиль метки, указывающий, что к пункту columns оператора SELECT не следует применять автоматическую маркировку.
Ниже столбцы с именами
columna
отображаются как есть, что означает, что имяcolumna
может относиться только к первому вхождению этого имени в наборе результатов, а также если оператор используется в качестве подзапроса:>>> from sqlalchemy import table, column, select, true, LABEL_STYLE_NONE >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_NONE)) {printsql}SELECT table1.columna, table1.columnb, table2.columna, table2.columnc FROM table1 JOIN table2 ON true
Используется с методом
Select.set_label_style()
.Добавлено в версии 1.4.
-
attribute
sqlalchemy.sql.expression.SelectLabelStyle.
LABEL_STYLE_TABLENAME_PLUS_COL = 1¶ Стиль метки, указывающий, что все столбцы должны быть помечены как
<tablename>_<columnname>
при генерации пункта columns оператора SELECT, чтобы разграничить одноименные столбцы, на которые ссылаются из разных таблиц, псевдонимов или подзапросов.Ниже всем именам столбцов присваивается метка, так что два одноименных столбца
columna
однозначно распознаются какtable1_columna
иtable2_columna
:>>> from sqlalchemy import table, column, select, true, LABEL_STYLE_TABLENAME_PLUS_COL >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL)) {printsql}SELECT table1.columna AS table1_columna, table1.columnb AS table1_columnb, table2.columna AS table2_columna, table2.columnc AS table2_columnc FROM table1 JOIN table2 ON true
Используется с методом
GenerativeSelect.set_label_style()
. Эквивалентен унаследованному методуSelect.apply_labels()
;LABEL_STYLE_TABLENAME_PLUS_COL
- это унаследованный стиль авторазметки SQLAlchemy.LABEL_STYLE_DISAMBIGUATE_ONLY
обеспечивает менее навязчивый подход к однозначному определению одноименных выражений столбцов.Добавлено в версии 1.4.
-
attribute
SQLAlchemy 2.0
Содержание
Дополнительно
Вы здесь:
-
Документация Django SQLAlchemy 2.0
- Ядро SQLAlchemy
- SQL Statements and Expressions API
- SELECT и связанные с ним конструкции
- SQL Statements and Expressions API
- Ядро SQLAlchemy