Доверенность Ассоциации¶
associationproxy
используется для создания вида чтения/записи целевого атрибута в рамках отношения. По сути, он скрывает использование «среднего» атрибута между двумя конечными точками и может быть использован для отбора полей как из коллекции связанных объектов, так и из скалярного отношения или для уменьшения многословности использования шаблона объекта ассоциации. При творческом подходе ассоциативный прокси позволяет создавать сложные коллекции и словарные представления практически любой геометрии, сохраняемые в базе данных с помощью стандартных, прозрачно конфигурируемых реляционных шаблонов.
Упрощение скалярных коллекций¶
Рассмотрим отображение «многие-ко-многим» между двумя классами User
и Keyword
. Каждый User
может иметь любое количество объектов Keyword
, и наоборот (паттерн «многие-ко-многим» описан в Многие ко многим). Приведенный ниже пример иллюстрирует эту схему аналогичным образом, за исключением того, что в класс User
добавлен дополнительный атрибут User.keywords
:
from __future__ import annotations
from typing import Final
from typing import List
from sqlalchemy import Column
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import Table
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.associationproxy import AssociationProxy
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
kw: Mapped[List[Keyword]] = relationship(secondary=lambda: user_keyword_table)
def __init__(self, name: str):
self.name = name
# proxy the 'keyword' attribute from the 'kw' relationship
keywords: AssociationProxy[List[str]] = association_proxy("kw", "keyword")
class Keyword(Base):
__tablename__ = "keyword"
id: Mapped[int] = mapped_column(primary_key=True)
keyword: Mapped[str] = mapped_column(String(64))
def __init__(self, keyword: str):
self.keyword = keyword
user_keyword_table: Final[Table] = Table(
"user_keyword",
Base.metadata,
Column("user_id", Integer, ForeignKey("user.id"), primary_key=True),
Column("keyword_id", Integer, ForeignKey("keyword.id"), primary_key=True),
)
В приведенном выше примере association_proxy()
применяется к классу User
для создания «представления» отношения kw
, которое раскрывает строковое значение .keyword
, связанное с каждым объектом Keyword
. Он также прозрачно создает новые объекты Keyword
при добавлении строк в коллекцию:
>>> user = User("jek")
>>> user.keywords.append("cheese-inspector")
>>> user.keywords.append("snack-ninja")
>>> print(user.keywords)
['cheese-inspector', 'snack-ninja']
Чтобы понять, как это происходит, сначала рассмотрим поведение User
и Keyword
без использования ассоциативного прокси .keywords
. Обычно чтение и работа с коллекцией строк «ключевых слов», ассоциированных с User
, требует обхода от каждого элемента коллекции до атрибута .keyword
, что может быть неудобно. Приведенный ниже пример иллюстрирует идентичную серию операций без использования ассоциативного прокси:
>>> # identical operations without using the association proxy
>>> user = User("jek")
>>> user.kw.append(Keyword("cheese-inspector"))
>>> user.kw.append(Keyword("snack-ninja"))
>>> print([keyword.keyword for keyword in user.kw])
['cheese-inspector', 'snack-ninja']
Объект AssociationProxy
, создаваемый функцией association_proxy()
, является экземпляром Python descriptor и никак не считается «отображенным» на Mapper
. Поэтому он всегда указывается inline в определении класса, на который производится отображение, независимо от того, используется ли декларативное или императивное отображение.
Прокси функционирует, оперируя базовым отображаемым атрибутом или коллекцией в ответ на операции, и изменения, сделанные через прокси, немедленно отображаются в отображаемом атрибуте, равно как и наоборот. При этом базовый атрибут остается полностью доступным.
При первом обращении ассоциативный прокси выполняет операции интроспекции над целевой коллекцией, чтобы ее поведение соответствовало действительности. При этом учитываются такие детали, как является ли локально проксируемый атрибут коллекцией (что типично) или скалярной ссылкой, а также действует ли коллекция как набор, список или словарь, так что прокси должен вести себя так же, как и базовая коллекция или атрибут.
Создание новых ценностей¶
При перехвате события list append()
(или set add()
, dictionary __setitem__()
, scalar assignment) ассоциативный прокси создает новый экземпляр объекта-«посредника» с помощью его конструктора, передавая в качестве единственного аргумента заданное значение. В нашем примере операция типа:
user.keywords.append("cheese-inspector")
Переводится прокси ассоциацией в операцию:
user.kw.append(Keyword("cheese-inspector"))
Пример работает, поскольку конструктор для Keyword
рассчитан на прием одного позиционного аргумента keyword
. Для тех случаев, когда использование одноаргументного конструктора не представляется возможным, поведение ассоциативного прокси можно настроить с помощью аргумента association_proxy.creator
, который ссылается на вызываемую (т.е. Python-функцию), которая будет создавать новый экземпляр объекта с учетом единственного аргумента. Ниже мы проиллюстрируем это с помощью типичной лямбды:
class User(Base):
...
# use Keyword(keyword=kw) on append() events
keywords: AssociationProxy[List[str]] = association_proxy(
"kw", "keyword", creator=lambda kw: Keyword(keyword=kw)
)
Функция creator
принимает один аргумент в случае коллекции, основанной на списках или наборах, или скалярный атрибут. В случае коллекции, основанной на словаре, она принимает два аргумента - «ключ» и «значение». Пример этого приведен ниже в Проксирование к коллекциям на основе словарей.
Упрощение объектов ассоциации¶
Модель «объект ассоциации» представляет собой расширенную форму отношения «многие-ко-многим» и описана в Объект ассоциации. Прокси ассоциации полезны для того, чтобы не мешать «объектам ассоциации» при регулярном использовании.
Предположим, что в нашей таблице user_keyword
имеются дополнительные столбцы, которые мы хотели бы отобразить явно, но в большинстве случаев нам не требуется прямой доступ к этим атрибутам. Ниже мы проиллюстрируем новое отображение, которое вводит класс UserKeywordAssociation
, отображаемый на таблицу user_keyword
, показанную ранее. Этот класс добавляет дополнительный столбец special_key
, к значению которого мы иногда хотим получить доступ, но не в обычном случае. Мы создаем ассоциативный прокси на классе User
под названием keywords
, который будет перекидывать мостик от коллекции user_keyword_associations
User
к атрибуту .keyword
, присутствующему на каждом UserKeywordAssociation
:
from __future__ import annotations
from typing import List
from typing import Optional
from sqlalchemy import ForeignKey
from sqlalchemy import String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.associationproxy import AssociationProxy
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
user_keyword_associations: Mapped[List[UserKeywordAssociation]] = relationship(
back_populates="user",
cascade="all, delete-orphan",
)
# association proxy of "user_keyword_associations" collection
# to "keyword" attribute
keywords: AssociationProxy[List[Keyword]] = association_proxy(
"user_keyword_associations",
"keyword",
creator=lambda keyword_obj: UserKeywordAssociation(keyword=keyword_obj),
)
def __init__(self, name: str):
self.name = name
class UserKeywordAssociation(Base):
__tablename__ = "user_keyword"
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"), primary_key=True)
keyword_id: Mapped[int] = mapped_column(ForeignKey("keyword.id"), primary_key=True)
special_key: Mapped[Optional[str]] = mapped_column(String(50))
user: Mapped[User] = relationship(back_populates="user_keyword_associations")
keyword: Mapped[Keyword] = relationship()
class Keyword(Base):
__tablename__ = "keyword"
id: Mapped[int] = mapped_column(primary_key=True)
keyword: Mapped[str] = mapped_column("keyword", String(64))
def __init__(self, keyword: str):
self.keyword = keyword
def __repr__(self) -> str:
return f"Keyword({self.keyword!r})"
С помощью приведенной выше конфигурации мы можем оперировать коллекцией .keywords
каждого объекта User
, каждый из которых экспонирует коллекцию объектов Keyword
, полученных из нижележащих элементов UserKeywordAssociation
:
>>> user = User("log")
>>> for kw in (Keyword("new_from_blammo"), Keyword("its_big")):
... user.keywords.append(kw)
>>> print(user.keywords)
[Keyword('new_from_blammo'), Keyword('its_big')]
Этот пример отличается от примера, показанного ранее в Упрощение скалярных коллекций, где ассоциативный прокси выставлял коллекцию строк, а не коллекцию составленных объектов. В этом случае каждая операция .keywords.append()
эквивалентна:
>>> user.user_keyword_associations.append(
... UserKeywordAssociation(keyword=Keyword("its_heavy"))
... )
Объект UserKeywordAssociation
имеет два атрибута, которые заполняются в рамках операции append()
, выполняемой ассоциативным прокси; .keyword
, который ссылается на объект Keyword
, и .user
, который ссылается на объект User
. Сначала заполняется атрибут .keyword
, так как в ответ на операцию .append()
ассоциативный прокси генерирует новый объект UserKeywordAssociation
, присваивая атрибуту .keyword
заданный экземпляр Keyword
. Затем, при добавлении объекта UserKeywordAssociation
в коллекцию User.user_keyword_associations
, атрибут UserKeywordAssociation.user
, сконфигурированный как back_populates
для User.user_keyword_associations
, инициализируется на данном экземпляре UserKeywordAssociation
для ссылки на родительский User
, получивший операцию добавления. Аргумент special_key
, указанный выше, оставлен в значении по умолчанию None
.
Для тех случаев, когда мы хотим, чтобы special_key
имел значение, мы создаем объект UserKeywordAssociation
явно. Ниже мы присваиваем все три атрибута, причем присвоение .user
при построении приводит к тому, что новый UserKeywordAssociation
добавляется к коллекции User.user_keyword_associations
(через отношение):
>>> UserKeywordAssociation(
... keyword=Keyword("its_wood"), user=user, special_key="my special key"
... )
Прокси ассоциации возвращает нам коллекцию Keyword
объектов, представленных всеми этими операциями:
>>> print(user.keywords)
[Keyword('new_from_blammo'), Keyword('its_big'), Keyword('its_heavy'), Keyword('its_wood')]
Проксирование к коллекциям на основе словарей¶
Ассоциативный прокси также может работать с коллекциями, основанными на словарях. В связках SQLAlchemy для создания словарных коллекций обычно используется тип коллекции attribute_keyed_dict()
, а также расширенные техники, описанные в Пользовательские коллекции на основе словарей.
При обнаружении использования коллекции на основе словаря ассоциативный прокси корректирует свое поведение. При добавлении новых значений в словарь ассоциативный прокси инстанцирует объект-посредник, передавая функции создания не один, а два аргумента - ключ и значение. Как обычно, эта функция создания по умолчанию соответствует конструктору класса-посредника и может быть настроена с помощью аргумента creator
.
Ниже мы модифицируем наш пример UserKeywordAssociation
таким образом, что коллекция User.user_keyword_associations
теперь будет отображаться с помощью словаря, где аргумент UserKeywordAssociation.special_key
будет использоваться в качестве ключа для словаря. Мы также применяем аргумент creator
к прокси User.keywords
, чтобы эти значения присваивались соответствующим образом при добавлении новых элементов в словарь:
from __future__ import annotations
from typing import Dict
from sqlalchemy import ForeignKey
from sqlalchemy import String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.associationproxy import AssociationProxy
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.orm.collections import attribute_keyed_dict
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
# user/user_keyword_associations relationship, mapping
# user_keyword_associations with a dictionary against "special_key" as key.
user_keyword_associations: Mapped[Dict[str, UserKeywordAssociation]] = relationship(
back_populates="user",
collection_class=attribute_keyed_dict("special_key"),
cascade="all, delete-orphan",
)
# proxy to 'user_keyword_associations', instantiating
# UserKeywordAssociation assigning the new key to 'special_key',
# values to 'keyword'.
keywords: AssociationProxy[Dict[str, Keyword]] = association_proxy(
"user_keyword_associations",
"keyword",
creator=lambda k, v: UserKeywordAssociation(special_key=k, keyword=v),
)
def __init__(self, name: str):
self.name = name
class UserKeywordAssociation(Base):
__tablename__ = "user_keyword"
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"), primary_key=True)
keyword_id: Mapped[int] = mapped_column(ForeignKey("keyword.id"), primary_key=True)
special_key: Mapped[str]
user: Mapped[User] = relationship(
back_populates="user_keyword_associations",
)
keyword: Mapped[Keyword] = relationship()
class Keyword(Base):
__tablename__ = "keyword"
id: Mapped[int] = mapped_column(primary_key=True)
keyword: Mapped[str] = mapped_column(String(64))
def __init__(self, keyword: str):
self.keyword = keyword
def __repr__(self) -> str:
return f"Keyword({self.keyword!r})"
Мы иллюстрируем коллекцию .keywords
как словарь, отображая значение UserKeywordAssociation.special_key
на объекты Keyword
:
>>> user = User("log")
>>> user.keywords["sk1"] = Keyword("kw1")
>>> user.keywords["sk2"] = Keyword("kw2")
>>> print(user.keywords)
{'sk1': Keyword('kw1'), 'sk2': Keyword('kw2')}
Доверенные лица объединений¶
Учитывая наши предыдущие примеры проксирования от отношения к скалярному атрибуту, проксирования через объект ассоциации и проксирования словарей, мы можем объединить все три техники вместе, чтобы получить словарь User
, который keywords
имеет дело строго со строковым значением special_key
, отображенным на строку keyword
. Оба класса UserKeywordAssociation
и Keyword
являются полностью скрытыми. Это достигается за счет построения ассоциативного прокси на User
, который ссылается на ассоциативный прокси, присутствующий на UserKeywordAssociation
:
from __future__ import annotations
from sqlalchemy import ForeignKey
from sqlalchemy import String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.associationproxy import AssociationProxy
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.orm.collections import attribute_keyed_dict
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
user_keyword_associations: Mapped[Dict[str, UserKeywordAssociation]] = relationship(
back_populates="user",
collection_class=attribute_keyed_dict("special_key"),
cascade="all, delete-orphan",
)
# the same 'user_keyword_associations'->'keyword' proxy as in
# the basic dictionary example.
keywords: AssociationProxy[Dict[str, str]] = association_proxy(
"user_keyword_associations",
"keyword",
creator=lambda k, v: UserKeywordAssociation(special_key=k, keyword=v),
)
def __init__(self, name: str):
self.name = name
class UserKeywordAssociation(Base):
__tablename__ = "user_keyword"
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"), primary_key=True)
keyword_id: Mapped[int] = mapped_column(ForeignKey("keyword.id"), primary_key=True)
special_key: Mapped[str] = mapped_column(String(64))
user: Mapped[User] = relationship(
back_populates="user_keyword_associations",
)
# the relationship to Keyword is now called
# 'kw'
kw: Mapped[Keyword] = relationship()
# 'keyword' is changed to be a proxy to the
# 'keyword' attribute of 'Keyword'
keyword: AssociationProxy[Dict[str, str]] = association_proxy("kw", "keyword")
class Keyword(Base):
__tablename__ = "keyword"
id: Mapped[int] = mapped_column(primary_key=True)
keyword: Mapped[str] = mapped_column(String(64))
def __init__(self, keyword: str):
self.keyword = keyword
Теперь User.keywords
представляет собой словарь string to string, в котором объекты UserKeywordAssociation
и Keyword
создаются и удаляются прозрачно с помощью ассоциативного прокси. В приведенном ниже примере мы иллюстрируем использование оператора присваивания, также соответствующим образом обрабатываемого ассоциативным прокси, для одновременного применения словарного значения к коллекции:
>>> user = User("log")
>>> user.keywords = {"sk1": "kw1", "sk2": "kw2"}
>>> print(user.keywords)
{'sk1': 'kw1', 'sk2': 'kw2'}
>>> user.keywords["sk3"] = "kw3"
>>> del user.keywords["sk2"]
>>> print(user.keywords)
{'sk1': 'kw1', 'sk3': 'kw3'}
>>> # illustrate un-proxied usage
... print(user.user_keyword_associations["sk3"].kw)
<__main__.Keyword object at 0x12ceb90>
Одна из оговорок нашего примера заключается в том, что, поскольку объекты Keyword
создаются для каждой операции набора словаря, в примере не удается сохранить уникальность объектов Keyword
по их строковому имени, что является типичным требованием для сценария создания тегов, подобного этому. Для данного случая рекомендуется использовать рецепт UniqueObject или аналогичную стратегию создания, которая будет применять стратегию «сначала ищем, потом создаем» к конструктору класса Keyword
, так что при наличии заданного имени будет возвращаться уже существующий Keyword
.
Запрос с использованием прокси ассоциаций¶
В AssociationProxy
реализованы простые возможности построения SQL, которые работают на уровне класса аналогично другим атрибутам, отображаемым в ORM, и обеспечивают рудиментарную поддержку фильтрации, основанную в основном на ключевом слове SQL EXISTS
.
Примечание
Основная цель расширения ассоциативного прокси - обеспечить улучшенную персистентность и шаблоны доступа к объектам с уже загруженными экземплярами отображенных объектов. Функция запросов с привязкой к классу имеет ограниченное применение и не заменит необходимости обращения к базовым атрибутам при построении SQL-запросов с использованием JOIN, опций ускоренной загрузки и т.д.
В данном разделе рассмотрим класс, имеющий как ассоциативный прокси, ссылающийся на столбец, так и ассоциативный прокси, ссылающийся на связанный объект, как в приведенном ниже примере отображения:
from __future__ import annotations
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.associationproxy import association_proxy, AssociationProxy
from sqlalchemy.orm import DeclarativeBase, relationship
from sqlalchemy.orm.collections import attribute_keyed_dict
from sqlalchemy.orm.collections import Mapped
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
user_keyword_associations: Mapped[UserKeywordAssociation] = relationship(
cascade="all, delete-orphan",
)
# object-targeted association proxy
keywords: AssociationProxy[List[Keyword]] = association_proxy(
"user_keyword_associations",
"keyword",
)
# column-targeted association proxy
special_keys: AssociationProxy[List[str]] = association_proxy(
"user_keyword_associations", "special_key"
)
class UserKeywordAssociation(Base):
__tablename__ = "user_keyword"
user_id: Mapped[int] = mapped_column(ForeignKey("user.id"), primary_key=True)
keyword_id: Mapped[int] = mapped_column(ForeignKey("keyword.id"), primary_key=True)
special_key: Mapped[str] = mapped_column(String(64))
keyword: Mapped[Keyword] = relationship()
class Keyword(Base):
__tablename__ = "keyword"
id: Mapped[int] = mapped_column(primary_key=True)
keyword: Mapped[str] = mapped_column(String(64))
Сгенерированный SQL имеет вид коррелированного подзапроса с SQL-оператором EXISTS, что позволяет использовать его в предложении WHERE без дополнительных модификаций вложенного запроса. Если непосредственной целью ассоциативного прокси является выражение сопоставленного столбца, то можно использовать стандартные операторы столбцов, которые будут встроены в подзапрос. Например, прямой оператор равенства:
>>> print(session.scalars(select(User).where(User.special_keys == "jek")))
{printsql}SELECT "user".id AS user_id, "user".name AS user_name
FROM "user"
WHERE EXISTS (SELECT 1
FROM user_keyword
WHERE "user".id = user_keyword.user_id AND user_keyword.special_key = :special_key_1)
оператор LIKE:
>>> print(session.scalars(select(User).where(User.special_keys.like("%jek"))))
{printsql}SELECT "user".id AS user_id, "user".name AS user_name
FROM "user"
WHERE EXISTS (SELECT 1
FROM user_keyword
WHERE "user".id = user_keyword.user_id AND user_keyword.special_key LIKE :special_key_1)
Для ассоциативных прокси, где непосредственной целью является связанный объект или коллекция, либо другой ассоциативный прокси или атрибут связанного объекта, можно использовать операторы, ориентированные на отношения, такие как PropComparator.has()
и PropComparator.any()
. Атрибут User.keywords
фактически представляет собой два связанных между собой ассоциативных прокси, поэтому при использовании этого прокси для генерации SQL-фраз мы получаем два уровня подзапросов EXISTS:
>>> print(session.scalars(select(User).where(User.keywords.any(Keyword.keyword == "jek"))))
{printsql}SELECT "user".id AS user_id, "user".name AS user_name
FROM "user"
WHERE EXISTS (SELECT 1
FROM user_keyword
WHERE "user".id = user_keyword.user_id AND (EXISTS (SELECT 1
FROM keyword
WHERE keyword.id = user_keyword.keyword_id AND keyword.keyword = :keyword_1)))
Это не самая эффективная форма SQL, поэтому, хотя ассоциативные прокси могут быть удобны для быстрой генерации критериев WHERE, результаты SQL следует проверять и «разворачивать» в явные критерии JOIN для наилучшего использования, особенно при объединении ассоциативных прокси в цепочки.
Изменено в версии 1.3: Ассоциативный прокси имеет различные режимы запроса в зависимости от типа цели. См. AssociationProxy теперь предоставляет стандартные операторы столбцов для целей, ориентированных на столбцы.
Каскадные скалярные удаления¶
Добавлено в версии 1.3.
Дано отображение в виде:
from __future__ import annotations
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.associationproxy import association_proxy, AssociationProxy
from sqlalchemy.orm import DeclarativeBase, relationship
from sqlalchemy.orm.collections import attribute_keyed_dict
from sqlalchemy.orm.collections import Mapped
class Base(DeclarativeBase):
pass
class A(Base):
__tablename__ = "test_a"
id: Mapped[int] = mapped_column(primary_key=True)
ab: Mapped[AB] = relationship(uselist=False)
b: AssociationProxy[B] = association_proxy(
"ab", "b", creator=lambda b: AB(b=b), cascade_scalar_deletes=True
)
class B(Base):
__tablename__ = "test_b"
id: Mapped[int] = mapped_column(primary_key=True)
class AB(Base):
__tablename__ = "test_ab"
a_id: Mapped[int] = mapped_column(ForeignKey(A.id), primary_key=True)
b_id: Mapped[int] = mapped_column(ForeignKey(B.id), primary_key=True)
b: Mapped[B] = relationship()
Присвоение A.b
породит объект AB
:
a.b = B()
Ассоциация A.b
является скалярной и включает использование параметра AssociationProxy.cascade_scalar_deletes
. Когда этот параметр включен, установка A.b
в None
приведет к удалению и A.ab
:
a.b = None
assert a.ab is None
Если AssociationProxy.cascade_scalar_deletes
не установлен, то приведенный выше объект ассоциации a.ab
останется на месте.
Обратите внимание, что для прокси-ассоциаций на основе коллекций такое поведение не предусмотрено: в этом случае промежуточный объект ассоциации всегда удаляется при удалении членов проксируемой коллекции. Удаление строки зависит от настройки каскада отношений.
См.также
Скалярные отношения¶
Приведенный ниже пример иллюстрирует использование ассоциативного прокси на стороне отношения «один-ко-многим» для доступа к атрибутам скалярного объекта:
from __future__ import annotations
from typing import List
from sqlalchemy import ForeignKey
from sqlalchemy import String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.associationproxy import AssociationProxy
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
class Base(DeclarativeBase):
pass
class Recipe(Base):
__tablename__ = "recipe"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(64))
steps: Mapped[List[Step]] = relationship(back_populates="recipe")
step_descriptions: AssociationProxy[List[str]] = association_proxy(
"steps", "description"
)
class Step(Base):
__tablename__ = "step"
id: Mapped[int] = mapped_column(primary_key=True)
description: Mapped[str]
recipe_id: Mapped[int] = mapped_column(ForeignKey("recipe.id"))
recipe: Mapped[Recipe] = relationship(back_populates="steps")
recipe_name: AssociationProxy[str] = association_proxy("recipe", "name")
def __init__(self, description: str) -> None:
self.description = description
my_snack = Recipe(
name="afternoon snack",
step_descriptions=[
"slice bread",
"spread peanut butted",
"eat sandwich",
],
)
Сводная информация о шагах my_snack
может быть выведена на печать с помощью:
>>> for i, step in enumerate(my_snack.steps, 1):
... print(f"Step {i} of {step.recipe_name!r}: {step.description}")
Step 1 of 'afternoon snack': slice bread
Step 2 of 'afternoon snack': spread peanut butted
Step 3 of 'afternoon snack': eat sandwich
Документация по API¶
Object Name | Description |
---|---|
association_proxy(target_collection, attr, *, [creator, getset_factory, proxy_factory, proxy_bulk_set, info, cascade_scalar_deletes, init, repr, default, default_factory, compare, kw_only]) |
Возвращает свойство Python, реализующее представление атрибута цели, которое ссылается на атрибут членов цели. |
Дескриптор, представляющий представление атрибута объекта в режиме чтения/записи. |
|
Перечисление. |
|
Объект для каждого класса, который обслуживает результаты, специфичные для класса и объекта. |
|
|
|
|
- function sqlalchemy.ext.associationproxy.association_proxy(target_collection: str, attr: str, *, creator: Optional[_CreatorProtocol] = None, getset_factory: Optional[_GetSetFactoryProtocol] = None, proxy_factory: Optional[_ProxyFactoryProtocol] = None, proxy_bulk_set: Optional[_ProxyBulkSetProtocol] = None, info: Optional[_InfoType] = None, cascade_scalar_deletes: bool = False, init: Union[_NoArg, bool] = _NoArg.NO_ARG, repr: Union[_NoArg, bool] = _NoArg.NO_ARG, default: Optional[Any] = _NoArg.NO_ARG, default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG) AssociationProxy[Any] ¶
Возвращает свойство Python, реализующее представление атрибута цели, которое ссылается на атрибут членов цели.
Возвращаемое значение является экземпляром
AssociationProxy
.Реализует свойство Python, представляющее отношение в виде коллекции более простых значений или скалярного значения. Проксируемое свойство будет имитировать тип коллекции объекта (list, dict или set), или, в случае отношения «один к одному», простое скалярное значение.
- Параметры:
target_collection – Имя атрибута, являющегося непосредственной целью. Обычно этот атрибут сопоставляется с помощью
relationship()
для связи с целевой коллекцией, но может быть и отношением «многие к одному» или нескалярным отношением.attr – Атрибут ассоциированного экземпляра или экземпляров, которые доступны для экземпляров целевого объекта.
creator – необязательный. Определяет пользовательское поведение при добавлении новых элементов в проксируемую коллекцию. По умолчанию добавление новых элементов в коллекцию вызывает построение экземпляра целевого объекта, передавая данный элемент в качестве позиционного аргумента в конструктор целевого объекта. Для случаев, когда этого недостаточно,
association_proxy.creator
может предоставить вызываемый объект, который будет конструировать объект соответствующим образом, учитывая переданный элемент. Для коллекций, ориентированных на списки и наборы, в вызываемую конструкцию передается один аргумент. Для коллекций, ориентированных на словарь, передаются два аргумента, соответствующие ключу и значению. Вызываемый модульassociation_proxy.creator
также вызывается для скалярных (т.е. многие-к-одному, один-к-одному) отношений. Если текущее значение атрибута целевого отношения равноNone
, то вызываемая переменная используется для построения нового объекта. Если объект уже существует, то данное значение атрибута помещается в этот объект. … seealso:: Создание новых ценностейcascade_scalar_deletes – при значении True указывает, что установка проксируемого значения в
None
или его удаление черезdel
также должно привести к удалению исходного объекта. Применяется только для скалярных атрибутов. Обычно удаление проксируемой цели не приводит к удалению проксируемого источника, так как этот объект может иметь другое состояние, которое необходимо сохранить. … versionadded:: 1.3 .. seealso:: Каскадные скалярные удаления - полный пример использованияinit – Специфично для Декларативное отображение классов данных, указывает, должен ли отображаемый атрибут быть частью метода
__init__()
, генерируемого процессом класса данных. … versionadded:: 2.0.0b4repr – Специфично для Декларативное отображение классов данных, указывает, должен ли атрибут, установленный этим
AssociationProxy
, быть частью метода__repr__()
, генерируемого процессом класса данных. … versionadded:: 2.0.0b4default_factory – Специфично для Декларативное отображение классов данных, задает функцию генерации значения по умолчанию, которая будет происходить в рамках метода
__init__()
, генерируемого процессом dataclass. … versionadded:: 2.0.0b4compare – Специфично для Декларативное отображение классов данных, указывает, должно ли это поле включаться в операции сравнения при генерации методов
__eq__()
и__ne__()
для сопоставленного класса. … versionadded:: 2.0.0b4kw_only – Специфично для Декларативное отображение классов данных, указывает, должно ли это поле быть помечено как предназначенное только для ключевого слова при генерации метода
__init__()
, генерируемого процессом dataclass. … versionadded:: 2.0.0b4info – необязательный, при наличии присваивается
AssociationProxy.info
.
Следующие дополнительные параметры предполагают внедрение пользовательского поведения в объект
AssociationProxy
и предназначены только для расширенного использования:- Параметры:
getset_factory – Необязательно. Доступ к прокси-атрибутам автоматически обрабатывается функциями, которые получают и устанавливают значения на основе аргумента attr для данного прокси. Если вы хотите настроить это поведение, вы можете предоставить вызываемую фабрику getset_factory, которая производит кортеж функций getter и setter. Фабрика вызывается с двумя аргументами - абстрактным типом базовой коллекции и данным экземпляром прокси.
proxy_factory – Необязательно. Тип эмулируемой коллекции определяется путем обнюхивания целевой коллекции. Если тип коллекции не может быть определен с помощью утиной типизации или вы хотите использовать другую реализацию коллекции, вы можете предоставить фабричную функцию для создания таких коллекций. Применимо только для нескалярных отношений.
proxy_bulk_set – Необязательно, используется с proxy_factory.
- class sqlalchemy.ext.associationproxy.AssociationProxy¶
Дескриптор, представляющий представление атрибута объекта в режиме чтения/записи.
Members
__init__(), creator, extension_type, for_class(), getset_factory, info, is_aliased_class, is_attribute, is_bundle, is_clause_element, is_instance, is_mapper, is_property, is_selectable, key, proxy_bulk_set, proxy_factory, target_collection, value_attr
Классическая подпись.
класс
sqlalchemy.ext.associationproxy.AssociationProxy
(sqlalchemy.orm.base.InspectionAttrInfo
,sqlalchemy.orm.base.ORMDescriptor
,sqlalchemy.orm._DCAttributeOptions
,sqlalchemy.ext.associationproxy._AssociationProxyProtocol
)-
method
sqlalchemy.ext.associationproxy.AssociationProxy.
__init__(target_collection: str, attr: str, *, creator: Optional[_CreatorProtocol] = None, getset_factory: Optional[_GetSetFactoryProtocol] = None, proxy_factory: Optional[_ProxyFactoryProtocol] = None, proxy_bulk_set: Optional[_ProxyBulkSetProtocol] = None, info: Optional[_InfoType] = None, cascade_scalar_deletes: bool = False, attribute_options: Optional[_AttributeOptions] = None)¶ Построить новый
AssociationProxy
.Объект
AssociationProxy
обычно строится с помощью функции-конструктораassociation_proxy()
. Описание всех параметров см. в описании функцииassociation_proxy()
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
creator: Optional[_CreatorProtocol]¶
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
extension_type: InspectionAttrExtensionType = 'ASSOCIATION_PROXY'¶ Тип расширения, если таковое имеется. По умолчанию
NotExtension.NOT_EXTENSION
-
method
sqlalchemy.ext.associationproxy.AssociationProxy.
for_class(class_: Type[Any], obj: Optional[object] = None) AssociationProxyInstance[_T] ¶ Возвращает внутреннее состояние, локальное для конкретного отображаемого класса.
Например, задан класс
User
:class User(Base): # ... keywords = association_proxy('kws', 'keyword')
Если мы обращаемся к этому
AssociationProxy
изMapper.all_orm_descriptors
и хотим просмотреть целевой класс для этого прокси, отображенный наUser
:inspect(User).all_orm_descriptors["keywords"].for_class(User).target_class
В результате возвращается экземпляр
AssociationProxyInstance
, специфичный для классаUser
. ОбъектAssociationProxy
остается независимым от своего родительского класса.- Параметры:
class_ – класс, для которого мы возвращаем состояние.
obj – optional, экземпляр класса, который необходим, если атрибут ссылается на полиморфную цель, например, когда для получения полного пути необходимо посмотреть тип реального объекта назначения.
Добавлено в версии 1.3: -
AssociationProxy
no longer stores any state specific to a particular parent class; the state is now stored in per-classAssociationProxyInstance
objects.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
getset_factory: Optional[_GetSetFactoryProtocol]¶
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
info¶ наследуется от
InspectionAttrInfo.info
атрибутаInspectionAttrInfo
Информационный словарь, связанный с объектом, позволяющий ассоциировать пользовательские данные с этим
InspectionAttr
.Словарь формируется при первом обращении к нему. Кроме того, он может быть указан в качестве аргумента конструктора функций
column_property()
,relationship()
илиcomposite()
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_aliased_class = False¶ наследуется от
InspectionAttr.is_aliased_class
атрибутаInspectionAttr
True, если данный объект является экземпляром
AliasedClass
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_attribute = True¶ True, если данный объект является Python descriptor.
Он может относиться к одному из многих типов. Обычно это
QueryableAttribute
, который обрабатывает события атрибутов от имениMapperProperty
. Но может быть и типом расширения, таким какAssociationProxy
илиhybrid_property
. При этомInspectionAttr.extension_type
будет ссылаться на константу, идентифицирующую конкретный подтип.См.также
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_bundle = False¶ наследуется от
InspectionAttr.is_bundle
атрибутаInspectionAttr
True, если данный объект является экземпляром
Bundle
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_clause_element = False¶ наследуется от
InspectionAttr.is_clause_element
атрибутаInspectionAttr
True, если данный объект является экземпляром
ClauseElement
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_instance = False¶ наследуется от
InspectionAttr.is_instance
атрибутаInspectionAttr
True, если данный объект является экземпляром
InstanceState
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_mapper = False¶ наследуется от
InspectionAttr.is_mapper
атрибутаInspectionAttr
True, если данный объект является экземпляром
Mapper
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_property = False¶ наследуется от
InspectionAttr.is_property
атрибутаInspectionAttr
True, если данный объект является экземпляром
MapperProperty
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
is_selectable = False¶ наследуется от
InspectionAttr.is_selectable
атрибутаInspectionAttr
Возвращает True, если данный объект является экземпляром
Selectable
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
key: str¶
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
proxy_bulk_set: Optional[_ProxyBulkSetProtocol]¶
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
proxy_factory: Optional[_ProxyFactoryProtocol]¶
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
target_collection: str¶
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxy.
value_attr: str¶
-
method
- class sqlalchemy.ext.associationproxy.AssociationProxyInstance¶
Объект для каждого класса, который обслуживает результаты, специфичные для класса и объекта.
Это используется
AssociationProxy
, когда он вызывается в терминах конкретного класса или экземпляра класса, т.е. когда он используется как обычный дескриптор Python.Если обращаться к
AssociationProxy
как к обычному дескриптору Python, тоAssociationProxyInstance
- это объект, который фактически обслуживает информацию. В обычных условиях его присутствие прозрачно:>>> User.keywords.scalar False
В частном случае, когда доступ к объекту
AssociationProxy
осуществляется напрямую, для получения явного обращения кAssociationProxyInstance
следует использовать методAssociationProxy.for_class()
:proxy_state = inspect(User).all_orm_descriptors["keywords"].for_class(User) # view if proxy object is scalar or not >>> proxy_state.scalar False
Добавлено в версии 1.3.
Members
__eq__(), __le__(), __lt__(), __ne__(), all_(), any(), any_(), asc(), attr, between(), bitwise_and(), bitwise_lshift(), bitwise_not(), bitwise_or(), bitwise_rshift(), bitwise_xor(), bool_op(), collate(), collection_class, concat(), contains(), delete(), desc(), distinct(), endswith(), for_proxy(), get(), has(), icontains(), iendswith(), ilike(), in_(), info, is_(), is_distinct_from(), is_not(), is_not_distinct_from(), isnot(), isnot_distinct_from(), istartswith(), like(), local_attr, match(), not_ilike(), not_in(), not_like(), notilike(), notin_(), notlike(), nulls_first(), nulls_last(), nullsfirst(), nullslast(), op(), operate(), parent, regexp_match(), regexp_replace(), remote_attr, reverse_operate(), scalar, set(), startswith(), target_class, timetuple
Классическая подпись.
класс
sqlalchemy.ext.associationproxy.AssociationProxyInstance
(sqlalchemy.orm.base.SQLORMOperations
)-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
__eq__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__eq__
методаColumnOperators
Реализовать оператор
==
.В контексте столбца выдает предложение
a = b
. Если целью являетсяNone
, то вырабатываетсяa IS NULL
.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
__le__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__le__
методаColumnOperators
Реализовать оператор
<=
.В контексте столбца порождает предложение
a <= b
.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
__lt__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__lt__
методаColumnOperators
Реализовать оператор
<
.В контексте столбца порождает предложение
a < b
.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
__ne__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__ne__
методаColumnOperators
Реализовать оператор
!=
.В контексте столбца выдает предложение
a != b
. Если целью являетсяNone
, то вырабатываетсяa IS NOT NULL
.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
all_() ColumnOperators ¶ наследуется от
ColumnOperators.all_()
методаColumnOperators
Произвести предложение
all_()
в отношении родительского объекта.Примеры см. в документации для
all_()
.Примечание
не путайте более новый метод
ColumnOperators.all_()
с его более старым аналогомARRAY
, методомComparator.all()
, который имеет другой синтаксис вызова и схему использования.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
any(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) ColumnElement[bool] ¶ Получение проксированного выражения „any“ с помощью EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
и/илиComparator.has()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
any_() ColumnOperators ¶ наследуется от
ColumnOperators.any_()
методаColumnOperators
Произвести предложение
any_()
в отношении родительского объекта.Примеры см. в документации для
any_()
.Примечание
не путайте более новый метод
ColumnOperators.any_()
с его более старым аналогомARRAY
, методомComparator.any()
, который имеет другой синтаксис вызова и схему использования.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
asc() ColumnOperators ¶ наследуется от
ColumnOperators.asc()
методаColumnOperators
Произвести предложение
asc()
в отношении родительского объекта.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
attr¶ Возвращает кортеж
(local_attr, remote_attr)
.Изначально этот атрибут предназначался для облегчения использования метода
Query.join()
для объединения сразу двух отношений, однако в этом случае используется устаревший стиль вызова.Чтобы использовать
select.join()
илиQuery.join()
с ассоциативным прокси, в настоящее время необходимо использовать атрибутыAssociationProxyInstance.local_attr
иAssociationProxyInstance.remote_attr
по отдельности:stmt = ( select(Parent). join(Parent.proxied.local_attr). join(Parent.proxied.remote_attr) )
Возможно, в будущем выпуске будет предложена более лаконичная схема объединения для атрибутов ассоциативного прокси.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
between(cleft: Any, cright: Any, symmetric: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.between()
методаColumnOperators
Выдать предложение
between()
относительно родительского объекта, задав нижний и верхний диапазон.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bitwise_and(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_and()
методаColumnOperators
Производить побитовую операцию AND, обычно с помощью оператора
&
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bitwise_lshift(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_lshift()
методаColumnOperators
Произвести побитовую операцию LSHIFT, обычно с помощью оператора
<<
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bitwise_not() ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_not()
методаColumnOperators
Производить побитовую операцию NOT, обычно с помощью оператора
~
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bitwise_or(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_or()
методаColumnOperators
Производить операцию побитового ИЛИ, обычно с помощью оператора
|
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bitwise_rshift(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_rshift()
методаColumnOperators
Производить побитовую операцию RSHIFT, обычно через оператор
>>
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bitwise_xor(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_xor()
методаColumnOperators
Произвести побитовую операцию XOR, обычно с помощью оператора
^
или#
для PostgreSQL.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
bool_op(opstring: str, precedence: int = 0, python_impl: Optional[Callable[[...], Any]] = None) Callable[[Any], Operators] ¶ наследуется от
Operators.bool_op()
методаOperators
Возвращает пользовательский булевский оператор.
Этот метод является сокращением для вызова
Operators.op()
и передачи флагаOperators.op.is_comparison
с True. Ключевым преимуществом использованияOperators.bool_op()
является то, что при использовании конструкций столбцов «булевский» характер возвращаемого выражения будет присутствовать для целей PEP 484.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
collate(collation: str) ColumnOperators ¶ наследуется от
ColumnOperators.collate()
методаColumnOperators
Вывести предложение
collate()
для родительского объекта, заданного строкой collation.См.также
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
collection_class: Optional[Type[Any]]¶
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
concat(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.concat()
методаColumnOperators
Реализовать оператор „concat“.
В контексте столбца вырабатывается предложение
a || b
, либо используется операторconcat()
в MySQL.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
contains(other: Any, **kw: Any) ColumnOperators ¶ наследуется от
ColumnOperators.contains()
методаColumnOperators
Реализовать оператор „contains“.
Выдает выражение LIKE, проверяющее совпадение с серединой строкового значения:
column LIKE '%' || <other> || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.contains("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.contains.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.contains.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.contains.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.contains(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE „%“ || :param || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.contains(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE „%“ || :param || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.contains.autoescape
:: somecolumn.contains(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
delete(obj: Any) None ¶
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
desc() ColumnOperators ¶ наследуется от
ColumnOperators.desc()
методаColumnOperators
Произвести предложение
desc()
в отношении родительского объекта.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
distinct() ColumnOperators ¶ наследуется от
ColumnOperators.distinct()
методаColumnOperators
Произвести предложение
distinct()
в отношении родительского объекта.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
endswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.endswith()
методаColumnOperators
Реализовать оператор „endswith“.
Выдает выражение LIKE, проверяющее совпадение с концом строкового значения:
column LIKE '%' || <other>
Например:
stmt = select(sometable).\ where(sometable.c.column.endswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.endswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.endswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.endswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.endswith(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE „%“ || :param ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ можно поместить перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.endswith(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE „%“ || :param ESCAPE „^“ Параметр также может быть объединен сColumnOperators.endswith.autoescape
:: somecolumn.endswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
classmethod
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
for_proxy(parent: AssociationProxy[_T], owning_class: Type[Any], parent_instance: Any) AssociationProxyInstance[_T] ¶
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
get(obj: Any) Union[_T, None, AssociationProxyInstance[_T]] ¶
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
has(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) ColumnElement[bool] ¶ Получение проксированного выражения „has“ с использованием EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
и/илиComparator.has()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
icontains(other: Any, **kw: Any) ColumnOperators ¶ наследуется от
ColumnOperators.icontains()
методаColumnOperators
Реализовать оператор
icontains
, например, нечувствительный к регистру вариантColumnOperators.contains()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение середины строкового значения:
lower(column) LIKE '%' || lower(<other>) || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.icontains("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.icontains.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.icontains.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.icontains.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.icontains(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.icontains(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.contains.autoescape
:: somecolumn.icontains(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
iendswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.iendswith()
методаColumnOperators
Реализовать оператор
iendswith
, например, нечувствительный к регистру вариантColumnOperators.endswith()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение конца строкового значения:
lower(column) LIKE '%' || lower(<other>)
Например:
stmt = select(sometable).\ where(sometable.c.column.iendswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.iendswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.iendswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.iendswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.iendswith(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.iendswith(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) ESCAPE „^“ Параметр также может быть объединен сColumnOperators.iendswith.autoescape
:: somecolumn.endswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
ilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.ilike()
методаColumnOperators
Реализовать оператор
ilike
, например, нечувствительный к регистру LIKE.В контексте столбца выдает выражение либо вида:
lower(a) LIKE lower(other)
Или на бэкендах, поддерживающих оператор ILIKE:
a ILIKE other
Например:
stmt = select(sometable).\ where(sometable.c.column.ilike("%foobar%"))
- Параметры:
other – сравниваемое выражение
escape – необязательный управляющий символ, отображает ключевое слово
ESCAPE
, например:: somecolumn.ilike(«foo/%bar», escape=»/»)
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
in_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.in_()
методаColumnOperators
Реализовать оператор
in
.В контексте столбца порождает предложение
column IN <other>
.Заданный параметр
other
может быть:Список литеральных значений, например:
stmt.where(column.in_([1, 2, 3]))
В этой форме вызова список элементов преобразуется в набор связанных параметров той же длины, что и заданный список:
WHERE COL IN (?, ?, ?)
Если сравнение производится с
tuple_()
, содержащим несколько выражений, может быть предоставлен список кортежей:from sqlalchemy import tuple_ stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
Пустой список, например:
stmt.where(column.in_([]))
В этом вызывающем виде выражение выдает выражение «пустой набор». Эти выражения адаптированы к конкретным бэкендам и обычно пытаются получить пустой оператор SELECT в качестве подзапроса. Например, на SQLite это выражение имеет вид:
WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
Изменено в версии 1.4: Пустые выражения IN теперь во всех случаях используют генерируемый во время выполнения подзапрос SELECT.
Связанный параметр, например
bindparam()
, может быть использован, если он содержит флагbindparam.expanding
:stmt.where(column.in_(bindparam('value', expanding=True)))
В этом вызывающем виде выражение выдает специальное не-SQL выражение placeholder, имеющее вид:
WHERE COL IN ([EXPANDING_value])
Это выражение-заполнитель перехватывается во время выполнения оператора и преобразуется в форму переменной номера связанного параметра, показанную ранее. Если бы оператор был выполнен в виде:
connection.execute(stmt, {"value": [1, 2, 3]})
Для каждого значения базе данных будет передан связанный параметр:
WHERE COL IN (?, ?, ?)
Добавлено в версии 1.2: добавлены «расширяющие» параметры привязки
Если передается пустой список, то выводится специальное выражение «пустой список», характерное для используемой базы данных. Для SQLite это будет:
WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
Добавлено в версии 1.3: «Расширяющиеся» связанные параметры теперь поддерживают пустые списки
конструкция
select()
, которая обычно является коррелированным скаляром select:stmt.where( column.in_( select(othertable.c.y). where(table.c.x == othertable.c.x) ) )
В этой вызывающей форме
ColumnOperators.in_()
выглядит так:WHERE COL IN (SELECT othertable.y FROM othertable WHERE othertable.x = table.x)
- Параметры:
other – список литералов, конструкция
select()
или конструкцияbindparam()
, содержащая флагbindparam.expanding
, установленный в True.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
is_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_()
методаColumnOperators
Реализовать оператор
IS
.Обычно при сравнении со значением
IS
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS
.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
is_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_distinct_from()
методаColumnOperators
Реализовать оператор
IS DISTINCT FROM
.На большинстве платформ отображается «a IS DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS NOT b».
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
is_not(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_not()
методаColumnOperators
Реализовать оператор
IS NOT
.Обычно при сравнении со значением
IS NOT
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS NOT
.Изменено в версии 1.4: Оператор
is_not()
переименован изisnot()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
is_not_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_not_distinct_from()
методаColumnOperators
Реализовать оператор
IS NOT DISTINCT FROM
.На большинстве платформ отображается «a IS NOT DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS b».
Изменено в версии 1.4: Оператор
is_not_distinct_from()
переименован изisnot_distinct_from()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
isnot(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.isnot()
методаColumnOperators
Реализовать оператор
IS NOT
.Обычно при сравнении со значением
IS NOT
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS NOT
.Изменено в версии 1.4: Оператор
is_not()
переименован изisnot()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
isnot_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.isnot_distinct_from()
методаColumnOperators
Реализовать оператор
IS NOT DISTINCT FROM
.На большинстве платформ отображается «a IS NOT DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS b».
Изменено в версии 1.4: Оператор
is_not_distinct_from()
переименован изisnot_distinct_from()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
istartswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.istartswith()
методаColumnOperators
Реализовать оператор
istartswith
, например, нечувствительный к регистру вариантColumnOperators.startswith()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение начала строкового значения:
lower(column) LIKE lower(<other>) || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.istartswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.istartswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.istartswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.istartswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.istartswith(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE lower(:param) || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.istartswith(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE lower(:param) || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.istartswith.autoescape
:: somecolumn.istartswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
like(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.like()
методаColumnOperators
Реализовать оператор
like
.В контексте столбца вырабатывается выражение:
a LIKE other
Например:
stmt = select(sometable).\ where(sometable.c.column.like("%foobar%"))
- Параметры:
other – сравниваемое выражение
escape – необязательный управляющий символ, отображает ключевое слово
ESCAPE
, например:: somecolumn.like(«foo/%bar», escape=»/»)
См.также
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
local_attr¶ Атрибут „локального“ класса, на который ссылается данный
AssociationProxyInstance
.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
match(other: Any, **kwargs: Any) ColumnOperators ¶ наследуется от
ColumnOperators.match()
методаColumnOperators
Реализует специфический для базы данных оператор „match“.
ColumnOperators.match()
пытается разрешиться в MATCH-подобную функцию или оператор, предоставляемый бэкендом. Примеры включают:PostgreSQL - выдает
x @@ plainto_tsquery(y)
Изменено в версии 2.0: Сейчас для PostgreSQL вместо
to_tsquery()
используетсяplainto_tsquery()
; для совместимости с другими формами см. Полнотекстовый поиск.MySQL - выдает
MATCH (x) AGAINST (y IN BOOLEAN MODE)
См.также
match
- специфическая для MySQL конструкция с дополнительными возможностями.Oracle - выдает
CONTAINS(x, y)
другие бэкенды могут предоставлять специальные реализации.
Бэкенды, не имеющие специальной реализации, будут выдавать оператор как «MATCH». Это совместимо, например, с SQLite.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
not_ilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.not_ilike()
методаColumnOperators
реализовать оператор
NOT ILIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.ilike()
, т.е.~x.ilike(y)
.Изменено в версии 1.4: Оператор
not_ilike()
переименован изnotilike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
not_in(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.not_in()
методаColumnOperators
реализовать оператор
NOT IN
.Это эквивалентно использованию отрицания с
ColumnOperators.in_()
, т.е.~x.in_(y)
.В случае, когда
other
является пустой последовательностью, компилятор выдает выражение «пусто не в». По умолчанию это выражение «1 = 1», которое во всех случаях выдает true. Для изменения этого поведения можно использоватьcreate_engine.empty_in_strategy
.Изменено в версии 1.4: Оператор
not_in()
переименован изnotin_()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.Изменено в версии 1.2: Операторы
ColumnOperators.in_()
иColumnOperators.not_in()
теперь по умолчанию выдают «статическое» выражение для пустой последовательности IN.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
not_like(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.not_like()
методаColumnOperators
реализовать оператор
NOT LIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.like()
, т.е.~x.like(y)
.Изменено в версии 1.4: Оператор
not_like()
переименован изnotlike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
notilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.notilike()
методаColumnOperators
реализовать оператор
NOT ILIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.ilike()
, т.е.~x.ilike(y)
.Изменено в версии 1.4: Оператор
not_ilike()
переименован изnotilike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
notin_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.notin_()
методаColumnOperators
реализовать оператор
NOT IN
.Это эквивалентно использованию отрицания с
ColumnOperators.in_()
, т.е.~x.in_(y)
.В случае, когда
other
является пустой последовательностью, компилятор выдает выражение «пусто не в». По умолчанию это выражение «1 = 1», которое во всех случаях выдает true. Для изменения этого поведения можно использоватьcreate_engine.empty_in_strategy
.Изменено в версии 1.4: Оператор
not_in()
переименован изnotin_()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.Изменено в версии 1.2: Операторы
ColumnOperators.in_()
иColumnOperators.not_in()
теперь по умолчанию выдают «статическое» выражение для пустой последовательности IN.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
notlike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.notlike()
методаColumnOperators
реализовать оператор
NOT LIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.like()
, т.е.~x.like(y)
.Изменено в версии 1.4: Оператор
not_like()
переименован изnotlike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
nulls_first() ColumnOperators ¶ наследуется от
ColumnOperators.nulls_first()
методаColumnOperators
Произвести предложение
nulls_first()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_first()
переименован изnullsfirst()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
nulls_last() ColumnOperators ¶ наследуется от
ColumnOperators.nulls_last()
методаColumnOperators
Произвести предложение
nulls_last()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_last()
переименован изnullslast()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
nullsfirst() ColumnOperators ¶ наследуется от
ColumnOperators.nullsfirst()
методаColumnOperators
Произвести предложение
nulls_first()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_first()
переименован изnullsfirst()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
nullslast() ColumnOperators ¶ наследуется от
ColumnOperators.nullslast()
методаColumnOperators
Произвести предложение
nulls_last()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_last()
переименован изnullslast()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Optional[Union[Type[TypeEngine[Any]], TypeEngine[Any]]] = None, python_impl: Optional[Callable[..., Any]] = None) Callable[[Any], Operators] ¶ наследуется от
Operators.op()
методаOperators
Вывести общую операторную функцию.
например:
somecolumn.op("*")(5)
производит:
somecolumn * 5
Эта функция также может быть использована для того, чтобы сделать побитовые операторы явными. Например:
somecolumn.op('&')(0xff)
является побитовым И из значения в
somecolumn
.- Параметры:
opstring – строка, которая будет выведена в качестве инфиксного оператора между данным элементом и выражением, переданным в генерируемую функцию.
precedence – приоритет, который база данных должна применять к оператору в SQL-выражениях. Это целочисленное значение служит подсказкой для компилятора SQL, когда следует использовать явные круглые скобки при выполнении той или иной операции. Меньшее число приводит к тому, что выражение будет заключено в круглые скобки, если оно применяется к другому оператору с более высоким старшинством. Значение по умолчанию
0
ниже всех операторов, кроме операторов запятой (,
) иAS
. Значение 100 будет выше или равно всем операторам, а -100 - ниже или равно всем операторам. … см. также:: Я использую op() для генерации пользовательского оператора, и мои скобки выходят неправильно - подробное описание того, как SQL-компилятор SQLAlchemy отображает круглые скобкиis_comparison – legacy; если True, то оператор будет рассматриваться как «оператор сравнения», то есть как оператор, который оценивается в булево значение true/false, например
==
,>
и т.д. Этот флаг устанавливается для того, чтобы ORM-отношения могли определить, что оператор является оператором сравнения, когда он используется в пользовательском условии объединения. Использование параметраis_comparison
заменяется использованием методаOperators.bool_op()
; этот более лаконичный оператор автоматически устанавливает этот параметр, а также обеспечивает корректную поддержку типа PEP 484, поскольку возвращаемый объект будет выражать тип данных «boolean», т.е.BinaryExpression[bool]
.return_type – класс или объект
TypeEngine
, который заставляет возвращать тип выражения, порожденного этим оператором, к данному типу. По умолчанию операторы, указывающиеOperators.op.is_comparison
, приводятся к типуBoolean
, а те, которые не приводятся, будут иметь тот же тип, что и левый операнд.python_impl – необязательная функция Python, которая может оценивать два значения Python таким же образом, как этот оператор работает на сервере базы данных. Используется для функций оценки выражений SQL в Python, например, для гибридных атрибутов ORM, а также для «оценщика» ORM, используемого для сопоставления объектов в сессии после многорядного обновления или удаления. например:: >>> expr = column(„x“).op(„+“, python_impl=lambda a, b: a + b)(„y“) Оператор для приведенного выражения будет работать и для не-SQL левых и правых объектов:: >>> expr.operator(5, 10) 15 … versionadded:: 2.0
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
operate(op: OperatorType, *other: Any, **kwargs: Any) Operators ¶ наследуется от
Operators.operate()
методаOperators
Оперировать аргументом.
Это самый низкий уровень работы, по умолчанию поднимает
NotImplementedError
.Переопределение этого параметра в подклассе может позволить применять общее поведение для всех операций. Например, переопределение
ColumnOperators
позволяет применятьfunc.lower()
к левой и правой стороне:class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- Параметры:
op – Вызываемый оператор.
*other – «другая» сторона операции. Для большинства операций это будет один скаляр.
**kwargs – модификаторы. Они могут передаваться специальными операторами, такими как
ColumnOperators.contains()
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
parent: _AssociationProxyProtocol[_T]¶
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
regexp_match(pattern: Any, flags: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.regexp_match()
методаColumnOperators
Реализует специфический для базы данных оператор „regexp match“.
Например:
stmt = select(table.c.some_column).where( table.c.some_column.regexp_match('^(b|c)') )
ColumnOperators.regexp_match()
пытается разрешиться в REGEXP-подобную функцию или оператор, предоставляемый бэкендом, однако конкретный синтаксис регулярных выражений и доступные флаги не зависят от бэкенда.Примеры включают:
PostgreSQL - при отрицании выдает
x ~ y
илиx !~ y
.Oracle - выдает
REGEXP_LIKE(x, y)
SQLite - использует оператор-заместитель SQLite
REGEXP
и обращается к встроенному модулю Pythonre.match()
.другие бэкенды могут предоставлять специальные реализации.
Бэкенды, не имеющие специальной реализации, будут выдавать оператор как «REGEXP» или «NOT REGEXP». Это совместимо, например, с SQLite и MySQL.
В настоящее время поддержка регулярных выражений реализована для Oracle, PostgreSQL, MySQL и MariaDB. Частичная поддержка имеется для SQLite. Поддержка диалектов сторонних разработчиков может отличаться.
- Параметры:
pattern – Строка шаблона регулярного выражения или предложение столбца.
flags – Любые флаги строк регулярных выражений для применения. Флаги, как правило, зависят от бэкенда. Это может быть строка или предложение столбца. Некоторые бэкенды, например, PostgreSQL и MariaDB, могут альтернативно указывать флаги как часть шаблона. При использовании флага игнорирования регистра „i“ в PostgreSQL будет использоваться оператор совпадения регэкспа
~*
или!~*
.
Добавлено в версии 1.4.
См.также
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
regexp_replace(pattern: Any, replacement: Any, flags: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.regexp_replace()
методаColumnOperators
Реализует специфический для базы данных оператор „regexp replace“.
Например:
stmt = select( table.c.some_column.regexp_replace( 'b(..)', 'XY', flags='g' ) )
ColumnOperators.regexp_replace()
пытается разрешиться в REGEXP_REPLACE-подобную функцию, предоставляемую бэкендом, который обычно выдает функциюREGEXP_REPLACE()
. Однако конкретный синтаксис регулярных выражений и доступные флаги не зависят от бэкенда.В настоящее время поддержка замены регулярных выражений реализована для Oracle, PostgreSQL, MySQL 8 и выше и MariaDB. Поддержка сторонних диалектов может отличаться.
- Параметры:
pattern – Строка шаблона регулярного выражения или предложение столбца.
pattern – Заменяющая строка или предложение столбца.
flags – Любые флаги строк регулярных выражений для применения. Флаги, как правило, зависят от бэкенда. Это может быть строка или предложение столбца. Некоторые бэкенды, например, PostgreSQL и MariaDB, могут альтернативно указывать флаги как часть шаблона.
Добавлено в версии 1.4.
См.также
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
remote_attr¶ Атрибут класса „remote“, на который ссылается данный
AssociationProxyInstance
.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
reverse_operate(op: OperatorType, other: Any, **kwargs: Any) Operators ¶ наследуется от
Operators.reverse_operate()
методаOperators
Обратные операции над аргументом.
Используется так же, как и
operate()
.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
scalar¶ Возвращает
True
, если данныйAssociationProxyInstance
проксирует скалярное отношение на локальной стороне.
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
set(obj: Any, values: _T) None ¶
-
method
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
startswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.startswith()
методаColumnOperators
Реализовать оператор
startswith
.Выдает выражение LIKE, проверяющее совпадение с началом строкового значения:
column LIKE <other> || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.startswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.startswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.startswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.startswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.startswith(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE :param || „%“ ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.startswith(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE :param || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.startswith.autoescape
:: somecolumn.startswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
target_class: Type[Any]¶ Класс-посредник, с которым работает данный
AssociationProxyInstance
.Перехваченные события append/set/assignment приведут к генерации новых экземпляров этого класса.
-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyInstance.
timetuple: Literal[None] = None¶ наследуется от
ColumnOperators.timetuple
атрибутаColumnOperators
Hack, позволяет сравнивать объекты datetime на LHS.
-
method
- class sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance¶
AssociationProxyInstance
, имеющий в качестве цели объект.Members
__le__(), __lt__(), all_(), any(), any_(), asc(), attr, between(), bitwise_and(), bitwise_lshift(), bitwise_not(), bitwise_or(), bitwise_rshift(), bitwise_xor(), bool_op(), collate(), concat(), contains(), desc(), distinct(), endswith(), has(), icontains(), iendswith(), ilike(), in_(), is_(), is_distinct_from(), is_not(), is_not_distinct_from(), isnot(), isnot_distinct_from(), istartswith(), like(), local_attr, match(), not_ilike(), not_in(), not_like(), notilike(), notin_(), notlike(), nulls_first(), nulls_last(), nullsfirst(), nullslast(), op(), operate(), regexp_match(), regexp_replace(), remote_attr, reverse_operate(), scalar, startswith(), target_class, timetuple
Классическая подпись.
класс
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance
(sqlalchemy.ext.associationproxy.AssociationProxyInstance
)-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
__le__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__le__
методаColumnOperators
Реализовать оператор
<=
.В контексте столбца порождает предложение
a <= b
.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
__lt__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__lt__
методаColumnOperators
Реализовать оператор
<
.В контексте столбца порождает предложение
a < b
.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
all_() ColumnOperators ¶ наследуется от
ColumnOperators.all_()
методаColumnOperators
Произвести предложение
all_()
в отношении родительского объекта.Примеры см. в документации для
all_()
.Примечание
не путайте более новый метод
ColumnOperators.all_()
с его более старым аналогомARRAY
, методомComparator.all()
, который имеет другой синтаксис вызова и схему использования.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
any(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) ColumnElement[bool] ¶ наследуется от
AssociationProxyInstance.any()
методаAssociationProxyInstance
Получение проксированного выражения „any“ с помощью EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
и/илиComparator.has()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
any_() ColumnOperators ¶ наследуется от
ColumnOperators.any_()
методаColumnOperators
Произвести предложение
any_()
в отношении родительского объекта.Примеры см. в документации для
any_()
.Примечание
не путайте более новый метод
ColumnOperators.any_()
с его более старым аналогомARRAY
, методомComparator.any()
, который имеет другой синтаксис вызова и схему использования.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
asc() ColumnOperators ¶ наследуется от
ColumnOperators.asc()
методаColumnOperators
Произвести предложение
asc()
в отношении родительского объекта.
-
attribute
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
attr¶ наследуется от
AssociationProxyInstance.attr
атрибутаAssociationProxyInstance
Возвращает кортеж
(local_attr, remote_attr)
.Изначально этот атрибут предназначался для облегчения использования метода
Query.join()
для объединения сразу двух отношений, однако в этом случае используется устаревший стиль вызова.Чтобы использовать
select.join()
илиQuery.join()
с ассоциативным прокси, в настоящее время необходимо использовать атрибутыAssociationProxyInstance.local_attr
иAssociationProxyInstance.remote_attr
по отдельности:stmt = ( select(Parent). join(Parent.proxied.local_attr). join(Parent.proxied.remote_attr) )
Возможно, в будущем выпуске будет предложена более лаконичная схема объединения для атрибутов ассоциативного прокси.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
between(cleft: Any, cright: Any, symmetric: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.between()
методаColumnOperators
Выдать предложение
between()
относительно родительского объекта, задав нижний и верхний диапазон.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bitwise_and(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_and()
методаColumnOperators
Производить побитовую операцию AND, обычно с помощью оператора
&
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bitwise_lshift(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_lshift()
методаColumnOperators
Произвести побитовую операцию LSHIFT, обычно с помощью оператора
<<
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bitwise_not() ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_not()
методаColumnOperators
Производить побитовую операцию NOT, обычно с помощью оператора
~
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bitwise_or(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_or()
методаColumnOperators
Производить операцию побитового ИЛИ, обычно с помощью оператора
|
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bitwise_rshift(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_rshift()
методаColumnOperators
Производить побитовую операцию RSHIFT, обычно через оператор
>>
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bitwise_xor(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_xor()
методаColumnOperators
Произвести побитовую операцию XOR, обычно с помощью оператора
^
или#
для PostgreSQL.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
bool_op(opstring: str, precedence: int = 0, python_impl: Optional[Callable[[...], Any]] = None) Callable[[Any], Operators] ¶ наследуется от
Operators.bool_op()
методаOperators
Возвращает пользовательский булевский оператор.
Этот метод является сокращением для вызова
Operators.op()
и передачи флагаOperators.op.is_comparison
с True. Ключевым преимуществом использованияOperators.bool_op()
является то, что при использовании конструкций столбцов «булевский» характер возвращаемого выражения будет присутствовать для целей PEP 484.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
collate(collation: str) ColumnOperators ¶ наследуется от
ColumnOperators.collate()
методаColumnOperators
Вывести предложение
collate()
для родительского объекта, заданного строкой collation.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
concat(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.concat()
методаColumnOperators
Реализовать оператор „concat“.
В контексте столбца вырабатывается предложение
a || b
, либо используется операторconcat()
в MySQL.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
contains(other: Any, **kw: Any) ColumnElement[bool] ¶ Создание проксированного выражения „contains“ с использованием EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
,Comparator.has()
и/илиComparator.contains()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
desc() ColumnOperators ¶ наследуется от
ColumnOperators.desc()
методаColumnOperators
Произвести предложение
desc()
в отношении родительского объекта.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
distinct() ColumnOperators ¶ наследуется от
ColumnOperators.distinct()
методаColumnOperators
Произвести предложение
distinct()
в отношении родительского объекта.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
endswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.endswith()
методаColumnOperators
Реализовать оператор „endswith“.
Выдает выражение LIKE, проверяющее совпадение с концом строкового значения:
column LIKE '%' || <other>
Например:
stmt = select(sometable).\ where(sometable.c.column.endswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.endswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.endswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.endswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.endswith(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE „%“ || :param ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ можно поместить перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.endswith(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE „%“ || :param ESCAPE „^“ Параметр также может быть объединен сColumnOperators.endswith.autoescape
:: somecolumn.endswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
has(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) ColumnElement[bool] ¶ наследуется от
AssociationProxyInstance.has()
методаAssociationProxyInstance
Получение проксированного выражения „has“ с использованием EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
и/илиComparator.has()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
icontains(other: Any, **kw: Any) ColumnOperators ¶ наследуется от
ColumnOperators.icontains()
методаColumnOperators
Реализовать оператор
icontains
, например, нечувствительный к регистру вариантColumnOperators.contains()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение середины строкового значения:
lower(column) LIKE '%' || lower(<other>) || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.icontains("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.icontains.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.icontains.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.icontains.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.icontains(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.icontains(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.contains.autoescape
:: somecolumn.icontains(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
iendswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.iendswith()
методаColumnOperators
Реализовать оператор
iendswith
, например, нечувствительный к регистру вариантColumnOperators.endswith()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение конца строкового значения:
lower(column) LIKE '%' || lower(<other>)
Например:
stmt = select(sometable).\ where(sometable.c.column.iendswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.iendswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.iendswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.iendswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.iendswith(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.iendswith(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) ESCAPE „^“ Параметр также может быть объединен сColumnOperators.iendswith.autoescape
:: somecolumn.endswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
ilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.ilike()
методаColumnOperators
Реализовать оператор
ilike
, например, нечувствительный к регистру LIKE.В контексте столбца выдает выражение либо вида:
lower(a) LIKE lower(other)
Или на бэкендах, поддерживающих оператор ILIKE:
a ILIKE other
Например:
stmt = select(sometable).\ where(sometable.c.column.ilike("%foobar%"))
- Параметры:
other – сравниваемое выражение
escape – необязательный управляющий символ, отображает ключевое слово
ESCAPE
, например:: somecolumn.ilike(«foo/%bar», escape=»/»)
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
in_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.in_()
методаColumnOperators
Реализовать оператор
in
.В контексте столбца порождает предложение
column IN <other>
.Заданный параметр
other
может быть:Список литеральных значений, например:
stmt.where(column.in_([1, 2, 3]))
В этой форме вызова список элементов преобразуется в набор связанных параметров той же длины, что и заданный список:
WHERE COL IN (?, ?, ?)
Если сравнение производится с
tuple_()
, содержащим несколько выражений, может быть предоставлен список кортежей:from sqlalchemy import tuple_ stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
Пустой список, например:
stmt.where(column.in_([]))
В этом вызывающем виде выражение выдает выражение «пустой набор». Эти выражения адаптированы к конкретным бэкендам и обычно пытаются получить пустой оператор SELECT в качестве подзапроса. Например, на SQLite это выражение имеет вид:
WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
Изменено в версии 1.4: Пустые выражения IN теперь во всех случаях используют генерируемый во время выполнения подзапрос SELECT.
Связанный параметр, например
bindparam()
, может быть использован, если он содержит флагbindparam.expanding
:stmt.where(column.in_(bindparam('value', expanding=True)))
В этом вызывающем виде выражение выдает специальное не-SQL выражение placeholder, имеющее вид:
WHERE COL IN ([EXPANDING_value])
Это выражение-заполнитель перехватывается во время выполнения оператора и преобразуется в форму переменной номера связанного параметра, показанную ранее. Если бы оператор был выполнен в виде:
connection.execute(stmt, {"value": [1, 2, 3]})
Для каждого значения базе данных будет передан связанный параметр:
WHERE COL IN (?, ?, ?)
Добавлено в версии 1.2: добавлены «расширяющие» параметры привязки
Если передается пустой список, то выводится специальное выражение «пустой список», характерное для используемой базы данных. Для SQLite это будет:
WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
Добавлено в версии 1.3: «Расширяющиеся» связанные параметры теперь поддерживают пустые списки
конструкция
select()
, которая обычно является коррелированным скаляром select:stmt.where( column.in_( select(othertable.c.y). where(table.c.x == othertable.c.x) ) )
В этой вызывающей форме
ColumnOperators.in_()
выглядит так:WHERE COL IN (SELECT othertable.y FROM othertable WHERE othertable.x = table.x)
- Параметры:
other – список литералов, конструкция
select()
или конструкцияbindparam()
, содержащая флагbindparam.expanding
, установленный в True.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
is_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_()
методаColumnOperators
Реализовать оператор
IS
.Обычно при сравнении со значением
IS
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS
.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
is_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_distinct_from()
методаColumnOperators
Реализовать оператор
IS DISTINCT FROM
.На большинстве платформ отображается «a IS DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS NOT b».
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
is_not(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_not()
методаColumnOperators
Реализовать оператор
IS NOT
.Обычно при сравнении со значением
IS NOT
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS NOT
.Изменено в версии 1.4: Оператор
is_not()
переименован изisnot()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
is_not_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_not_distinct_from()
методаColumnOperators
Реализовать оператор
IS NOT DISTINCT FROM
.На большинстве платформ отображается «a IS NOT DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS b».
Изменено в версии 1.4: Оператор
is_not_distinct_from()
переименован изisnot_distinct_from()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
isnot(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.isnot()
методаColumnOperators
Реализовать оператор
IS NOT
.Обычно при сравнении со значением
IS NOT
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS NOT
.Изменено в версии 1.4: Оператор
is_not()
переименован изisnot()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
isnot_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.isnot_distinct_from()
методаColumnOperators
Реализовать оператор
IS NOT DISTINCT FROM
.На большинстве платформ отображается «a IS NOT DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS b».
Изменено в версии 1.4: Оператор
is_not_distinct_from()
переименован изisnot_distinct_from()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
istartswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.istartswith()
методаColumnOperators
Реализовать оператор
istartswith
, например, нечувствительный к регистру вариантColumnOperators.startswith()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение начала строкового значения:
lower(column) LIKE lower(<other>) || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.istartswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.istartswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.istartswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.istartswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.istartswith(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE lower(:param) || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.istartswith(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE lower(:param) || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.istartswith.autoescape
:: somecolumn.istartswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
like(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.like()
методаColumnOperators
Реализовать оператор
like
.В контексте столбца вырабатывается выражение:
a LIKE other
Например:
stmt = select(sometable).\ where(sometable.c.column.like("%foobar%"))
- Параметры:
other – сравниваемое выражение
escape – необязательный управляющий символ, отображает ключевое слово
ESCAPE
, например:: somecolumn.like(«foo/%bar», escape=»/»)
См.также
-
attribute
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
local_attr¶ наследуется от
AssociationProxyInstance.local_attr
атрибутаAssociationProxyInstance
Атрибут „локального“ класса, на который ссылается данный
AssociationProxyInstance
.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
match(other: Any, **kwargs: Any) ColumnOperators ¶ наследуется от
ColumnOperators.match()
методаColumnOperators
Реализует специфический для базы данных оператор „match“.
ColumnOperators.match()
пытается разрешиться в MATCH-подобную функцию или оператор, предоставляемый бэкендом. Примеры включают:PostgreSQL - выдает
x @@ plainto_tsquery(y)
Изменено в версии 2.0: Сейчас для PostgreSQL вместо
to_tsquery()
используетсяplainto_tsquery()
; для совместимости с другими формами см. Полнотекстовый поиск.MySQL - выдает
MATCH (x) AGAINST (y IN BOOLEAN MODE)
См.также
match
- специфическая для MySQL конструкция с дополнительными возможностями.Oracle - выдает
CONTAINS(x, y)
другие бэкенды могут предоставлять специальные реализации.
Бэкенды, не имеющие специальной реализации, будут выдавать оператор как «MATCH». Это совместимо, например, с SQLite.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
not_ilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.not_ilike()
методаColumnOperators
реализовать оператор
NOT ILIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.ilike()
, т.е.~x.ilike(y)
.Изменено в версии 1.4: Оператор
not_ilike()
переименован изnotilike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
not_in(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.not_in()
методаColumnOperators
реализовать оператор
NOT IN
.Это эквивалентно использованию отрицания с
ColumnOperators.in_()
, т.е.~x.in_(y)
.В случае, когда
other
является пустой последовательностью, компилятор выдает выражение «пусто не в». По умолчанию это выражение «1 = 1», которое во всех случаях выдает true. Для изменения этого поведения можно использоватьcreate_engine.empty_in_strategy
.Изменено в версии 1.4: Оператор
not_in()
переименован изnotin_()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.Изменено в версии 1.2: Операторы
ColumnOperators.in_()
иColumnOperators.not_in()
теперь по умолчанию выдают «статическое» выражение для пустой последовательности IN.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
not_like(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.not_like()
методаColumnOperators
реализовать оператор
NOT LIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.like()
, т.е.~x.like(y)
.Изменено в версии 1.4: Оператор
not_like()
переименован изnotlike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
notilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.notilike()
методаColumnOperators
реализовать оператор
NOT ILIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.ilike()
, т.е.~x.ilike(y)
.Изменено в версии 1.4: Оператор
not_ilike()
переименован изnotilike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
notin_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.notin_()
методаColumnOperators
реализовать оператор
NOT IN
.Это эквивалентно использованию отрицания с
ColumnOperators.in_()
, т.е.~x.in_(y)
.В случае, когда
other
является пустой последовательностью, компилятор выдает выражение «пусто не в». По умолчанию это выражение «1 = 1», которое во всех случаях выдает true. Для изменения этого поведения можно использоватьcreate_engine.empty_in_strategy
.Изменено в версии 1.4: Оператор
not_in()
переименован изnotin_()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.Изменено в версии 1.2: Операторы
ColumnOperators.in_()
иColumnOperators.not_in()
теперь по умолчанию выдают «статическое» выражение для пустой последовательности IN.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
notlike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.notlike()
методаColumnOperators
реализовать оператор
NOT LIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.like()
, т.е.~x.like(y)
.Изменено в версии 1.4: Оператор
not_like()
переименован изnotlike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
nulls_first() ColumnOperators ¶ наследуется от
ColumnOperators.nulls_first()
методаColumnOperators
Произвести предложение
nulls_first()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_first()
переименован изnullsfirst()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
nulls_last() ColumnOperators ¶ наследуется от
ColumnOperators.nulls_last()
методаColumnOperators
Произвести предложение
nulls_last()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_last()
переименован изnullslast()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
nullsfirst() ColumnOperators ¶ наследуется от
ColumnOperators.nullsfirst()
методаColumnOperators
Произвести предложение
nulls_first()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_first()
переименован изnullsfirst()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
nullslast() ColumnOperators ¶ наследуется от
ColumnOperators.nullslast()
методаColumnOperators
Произвести предложение
nulls_last()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_last()
переименован изnullslast()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Optional[Union[Type[TypeEngine[Any]], TypeEngine[Any]]] = None, python_impl: Optional[Callable[..., Any]] = None) Callable[[Any], Operators] ¶ наследуется от
Operators.op()
методаOperators
Вывести общую операторную функцию.
например:
somecolumn.op("*")(5)
производит:
somecolumn * 5
Эта функция также может быть использована для того, чтобы сделать побитовые операторы явными. Например:
somecolumn.op('&')(0xff)
является побитовым И из значения в
somecolumn
.- Параметры:
opstring – строка, которая будет выведена в качестве инфиксного оператора между данным элементом и выражением, переданным в генерируемую функцию.
precedence – приоритет, который база данных должна применять к оператору в SQL-выражениях. Это целочисленное значение служит подсказкой для компилятора SQL, когда следует использовать явные круглые скобки при выполнении той или иной операции. Меньшее число приводит к тому, что выражение будет заключено в круглые скобки, если оно применяется к другому оператору с более высоким старшинством. Значение по умолчанию
0
ниже всех операторов, кроме операторов запятой (,
) иAS
. Значение 100 будет выше или равно всем операторам, а -100 - ниже или равно всем операторам. … см. также:: Я использую op() для генерации пользовательского оператора, и мои скобки выходят неправильно - подробное описание того, как SQL-компилятор SQLAlchemy отображает круглые скобкиis_comparison – legacy; если True, то оператор будет рассматриваться как «оператор сравнения», то есть как оператор, который оценивается в булево значение true/false, например
==
,>
и т.д. Этот флаг устанавливается для того, чтобы ORM-отношения могли определить, что оператор является оператором сравнения, когда он используется в пользовательском условии объединения. Использование параметраis_comparison
заменяется использованием методаOperators.bool_op()
; этот более лаконичный оператор автоматически устанавливает этот параметр, а также обеспечивает корректную поддержку типа PEP 484, поскольку возвращаемый объект будет выражать тип данных «boolean», т.е.BinaryExpression[bool]
.return_type – класс или объект
TypeEngine
, который заставляет возвращать тип выражения, порожденного этим оператором, к данному типу. По умолчанию операторы, указывающиеOperators.op.is_comparison
, приводятся к типуBoolean
, а те, которые не приводятся, будут иметь тот же тип, что и левый операнд.python_impl – необязательная функция Python, которая может оценивать два значения Python таким же образом, как этот оператор работает на сервере базы данных. Используется для функций оценки выражений SQL в Python, например, для гибридных атрибутов ORM, а также для «оценщика» ORM, используемого для сопоставления объектов в сессии после многорядного обновления или удаления. например:: >>> expr = column(„x“).op(„+“, python_impl=lambda a, b: a + b)(„y“) Оператор для приведенного выражения будет работать и для не-SQL левых и правых объектов:: >>> expr.operator(5, 10) 15 … versionadded:: 2.0
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
operate(op: OperatorType, *other: Any, **kwargs: Any) Operators ¶ наследуется от
Operators.operate()
методаOperators
Оперировать аргументом.
Это самый низкий уровень работы, по умолчанию поднимает
NotImplementedError
.Переопределение этого параметра в подклассе может позволить применять общее поведение для всех операций. Например, переопределение
ColumnOperators
позволяет применятьfunc.lower()
к левой и правой стороне:class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- Параметры:
op – Вызываемый оператор.
*other – «другая» сторона операции. Для большинства операций это будет один скаляр.
**kwargs – модификаторы. Они могут передаваться специальными операторами, такими как
ColumnOperators.contains()
.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
regexp_match(pattern: Any, flags: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.regexp_match()
методаColumnOperators
Реализует специфический для базы данных оператор „regexp match“.
Например:
stmt = select(table.c.some_column).where( table.c.some_column.regexp_match('^(b|c)') )
ColumnOperators.regexp_match()
пытается разрешиться в REGEXP-подобную функцию или оператор, предоставляемый бэкендом, однако конкретный синтаксис регулярных выражений и доступные флаги не зависят от бэкенда.Примеры включают:
PostgreSQL - при отрицании выдает
x ~ y
илиx !~ y
.Oracle - выдает
REGEXP_LIKE(x, y)
SQLite - использует оператор-заместитель SQLite
REGEXP
и обращается к встроенному модулю Pythonre.match()
.другие бэкенды могут предоставлять специальные реализации.
Бэкенды, не имеющие специальной реализации, будут выдавать оператор как «REGEXP» или «NOT REGEXP». Это совместимо, например, с SQLite и MySQL.
В настоящее время поддержка регулярных выражений реализована для Oracle, PostgreSQL, MySQL и MariaDB. Частичная поддержка имеется для SQLite. Поддержка диалектов сторонних разработчиков может отличаться.
- Параметры:
pattern – Строка шаблона регулярного выражения или предложение столбца.
flags – Любые флаги строк регулярных выражений для применения. Флаги, как правило, зависят от бэкенда. Это может быть строка или предложение столбца. Некоторые бэкенды, например, PostgreSQL и MariaDB, могут альтернативно указывать флаги как часть шаблона. При использовании флага игнорирования регистра „i“ в PostgreSQL будет использоваться оператор совпадения регэкспа
~*
или!~*
.
Добавлено в версии 1.4.
См.также
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
regexp_replace(pattern: Any, replacement: Any, flags: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.regexp_replace()
методаColumnOperators
Реализует специфический для базы данных оператор „regexp replace“.
Например:
stmt = select( table.c.some_column.regexp_replace( 'b(..)', 'XY', flags='g' ) )
ColumnOperators.regexp_replace()
пытается разрешиться в REGEXP_REPLACE-подобную функцию, предоставляемую бэкендом, который обычно выдает функциюREGEXP_REPLACE()
. Однако конкретный синтаксис регулярных выражений и доступные флаги не зависят от бэкенда.В настоящее время поддержка замены регулярных выражений реализована для Oracle, PostgreSQL, MySQL 8 и выше и MariaDB. Поддержка сторонних диалектов может отличаться.
- Параметры:
pattern – Строка шаблона регулярного выражения или предложение столбца.
pattern – Заменяющая строка или предложение столбца.
flags – Любые флаги строк регулярных выражений для применения. Флаги, как правило, зависят от бэкенда. Это может быть строка или предложение столбца. Некоторые бэкенды, например, PostgreSQL и MariaDB, могут альтернативно указывать флаги как часть шаблона.
Добавлено в версии 1.4.
См.также
-
attribute
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
remote_attr¶ наследуется от
AssociationProxyInstance.remote_attr
атрибутаAssociationProxyInstance
Атрибут класса „remote“, на который ссылается данный
AssociationProxyInstance
.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
reverse_operate(op: OperatorType, other: Any, **kwargs: Any) Operators ¶ наследуется от
Operators.reverse_operate()
методаOperators
Обратные операции над аргументом.
Используется так же, как и
operate()
.
-
attribute
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
scalar¶ наследуется от
AssociationProxyInstance.scalar
атрибутаAssociationProxyInstance
Возвращает
True
, если данныйAssociationProxyInstance
проксирует скалярное отношение на локальной стороне.
-
method
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
startswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.startswith()
методаColumnOperators
Реализовать оператор
startswith
.Выдает выражение LIKE, проверяющее совпадение с началом строкового значения:
column LIKE <other> || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.startswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.startswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.startswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.startswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.startswith(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE :param || „%“ ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.startswith(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE :param || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.startswith.autoescape
:: somecolumn.startswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
attribute
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
target_class: Type[Any]¶ Класс-посредник, с которым работает данный
AssociationProxyInstance
.Перехваченные события append/set/assignment приведут к генерации новых экземпляров этого класса.
-
attribute
sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.
timetuple: Literal[None] = None¶ наследуется от
ColumnOperators.timetuple
атрибутаColumnOperators
Hack, позволяет сравнивать объекты datetime на LHS.
-
method
- class sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance¶
AssociationProxyInstance
, имеющий в качестве цели столбец базы данных.Members
__le__(), __lt__(), __ne__(), all_(), any(), any_(), asc(), attr, between(), bitwise_and(), bitwise_lshift(), bitwise_not(), bitwise_or(), bitwise_rshift(), bitwise_xor(), bool_op(), collate(), concat(), contains(), desc(), distinct(), endswith(), has(), icontains(), iendswith(), ilike(), in_(), is_(), is_distinct_from(), is_not(), is_not_distinct_from(), isnot(), isnot_distinct_from(), istartswith(), like(), local_attr, match(), not_ilike(), not_in(), not_like(), notilike(), notin_(), notlike(), nulls_first(), nulls_last(), nullsfirst(), nullslast(), op(), operate(), regexp_match(), regexp_replace(), remote_attr, reverse_operate(), scalar, startswith(), target_class, timetuple
Классическая подпись.
класс
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance
(sqlalchemy.ext.associationproxy.AssociationProxyInstance
)-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
__le__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__le__
методаColumnOperators
Реализовать оператор
<=
.В контексте столбца порождает предложение
a <= b
.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
__lt__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__lt__
методаColumnOperators
Реализовать оператор
<
.В контексте столбца порождает предложение
a < b
.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
__ne__(other: Any) ColumnOperators ¶ наследуется от
sqlalchemy.sql.expression.ColumnOperators.__ne__
методаColumnOperators
Реализовать оператор
!=
.В контексте столбца выдает предложение
a != b
. Если целью являетсяNone
, то вырабатываетсяa IS NOT NULL
.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
all_() ColumnOperators ¶ наследуется от
ColumnOperators.all_()
методаColumnOperators
Произвести предложение
all_()
в отношении родительского объекта.Примеры см. в документации для
all_()
.Примечание
не путайте более новый метод
ColumnOperators.all_()
с его более старым аналогомARRAY
, методомComparator.all()
, который имеет другой синтаксис вызова и схему использования.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
any(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) ColumnElement[bool] ¶ наследуется от
AssociationProxyInstance.any()
методаAssociationProxyInstance
Получение проксированного выражения „any“ с помощью EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
и/илиComparator.has()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
any_() ColumnOperators ¶ наследуется от
ColumnOperators.any_()
методаColumnOperators
Произвести предложение
any_()
в отношении родительского объекта.Примеры см. в документации для
any_()
.Примечание
не путайте более новый метод
ColumnOperators.any_()
с его более старым аналогомARRAY
, методомComparator.any()
, который имеет другой синтаксис вызова и схему использования.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
asc() ColumnOperators ¶ наследуется от
ColumnOperators.asc()
методаColumnOperators
Произвести предложение
asc()
в отношении родительского объекта.
-
attribute
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
attr¶ наследуется от
AssociationProxyInstance.attr
атрибутаAssociationProxyInstance
Возвращает кортеж
(local_attr, remote_attr)
.Изначально этот атрибут предназначался для облегчения использования метода
Query.join()
для объединения сразу двух отношений, однако в этом случае используется устаревший стиль вызова.Чтобы использовать
select.join()
илиQuery.join()
с ассоциативным прокси, в настоящее время необходимо использовать атрибутыAssociationProxyInstance.local_attr
иAssociationProxyInstance.remote_attr
по отдельности:stmt = ( select(Parent). join(Parent.proxied.local_attr). join(Parent.proxied.remote_attr) )
Возможно, в будущем выпуске будет предложена более лаконичная схема объединения для атрибутов ассоциативного прокси.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
between(cleft: Any, cright: Any, symmetric: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.between()
методаColumnOperators
Выдать предложение
between()
относительно родительского объекта, задав нижний и верхний диапазон.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bitwise_and(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_and()
методаColumnOperators
Производить побитовую операцию AND, обычно с помощью оператора
&
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bitwise_lshift(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_lshift()
методаColumnOperators
Произвести побитовую операцию LSHIFT, обычно с помощью оператора
<<
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bitwise_not() ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_not()
методаColumnOperators
Производить побитовую операцию NOT, обычно с помощью оператора
~
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bitwise_or(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_or()
методаColumnOperators
Производить операцию побитового ИЛИ, обычно с помощью оператора
|
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bitwise_rshift(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_rshift()
методаColumnOperators
Производить побитовую операцию RSHIFT, обычно через оператор
>>
.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bitwise_xor(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.bitwise_xor()
методаColumnOperators
Произвести побитовую операцию XOR, обычно с помощью оператора
^
или#
для PostgreSQL.Добавлено в версии 2.0.2.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
bool_op(opstring: str, precedence: int = 0, python_impl: Optional[Callable[[...], Any]] = None) Callable[[Any], Operators] ¶ наследуется от
Operators.bool_op()
методаOperators
Возвращает пользовательский булевский оператор.
Этот метод является сокращением для вызова
Operators.op()
и передачи флагаOperators.op.is_comparison
с True. Ключевым преимуществом использованияOperators.bool_op()
является то, что при использовании конструкций столбцов «булевский» характер возвращаемого выражения будет присутствовать для целей PEP 484.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
collate(collation: str) ColumnOperators ¶ наследуется от
ColumnOperators.collate()
методаColumnOperators
Вывести предложение
collate()
для родительского объекта, заданного строкой collation.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
concat(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.concat()
методаColumnOperators
Реализовать оператор „concat“.
В контексте столбца вырабатывается предложение
a || b
, либо используется операторconcat()
в MySQL.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
contains(other: Any, **kw: Any) ColumnOperators ¶ наследуется от
ColumnOperators.contains()
методаColumnOperators
Реализовать оператор „contains“.
Выдает выражение LIKE, проверяющее совпадение с серединой строкового значения:
column LIKE '%' || <other> || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.contains("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.contains.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.contains.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.contains.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.contains(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE „%“ || :param || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.contains(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE „%“ || :param || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.contains.autoescape
:: somecolumn.contains(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
desc() ColumnOperators ¶ наследуется от
ColumnOperators.desc()
методаColumnOperators
Произвести предложение
desc()
в отношении родительского объекта.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
distinct() ColumnOperators ¶ наследуется от
ColumnOperators.distinct()
методаColumnOperators
Произвести предложение
distinct()
в отношении родительского объекта.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
endswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.endswith()
методаColumnOperators
Реализовать оператор „endswith“.
Выдает выражение LIKE, проверяющее совпадение с концом строкового значения:
column LIKE '%' || <other>
Например:
stmt = select(sometable).\ where(sometable.c.column.endswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.endswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.endswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.endswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.endswith(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE „%“ || :param ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ можно поместить перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.endswith(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE „%“ || :param ESCAPE „^“ Параметр также может быть объединен сColumnOperators.endswith.autoescape
:: somecolumn.endswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
has(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) ColumnElement[bool] ¶ наследуется от
AssociationProxyInstance.has()
методаAssociationProxyInstance
Получение проксированного выражения „has“ с использованием EXISTS.
Это выражение будет представлять собой составное произведение с использованием операторов
Comparator.any()
и/илиComparator.has()
базовых проксируемых атрибутов.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
icontains(other: Any, **kw: Any) ColumnOperators ¶ наследуется от
ColumnOperators.icontains()
методаColumnOperators
Реализовать оператор
icontains
, например, нечувствительный к регистру вариантColumnOperators.contains()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение середины строкового значения:
lower(column) LIKE '%' || lower(<other>) || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.icontains("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.icontains.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.icontains.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.icontains.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.icontains(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.icontains(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.contains.autoescape
:: somecolumn.icontains(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
iendswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.iendswith()
методаColumnOperators
Реализовать оператор
iendswith
, например, нечувствительный к регистру вариантColumnOperators.endswith()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение конца строкового значения:
lower(column) LIKE '%' || lower(<other>)
Например:
stmt = select(sometable).\ where(sometable.c.column.iendswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.iendswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.iendswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.iendswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.iendswith(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.iendswith(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE „%“ || lower(:param) ESCAPE „^“ Параметр также может быть объединен сColumnOperators.iendswith.autoescape
:: somecolumn.endswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
ilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.ilike()
методаColumnOperators
Реализовать оператор
ilike
, например, нечувствительный к регистру LIKE.В контексте столбца выдает выражение либо вида:
lower(a) LIKE lower(other)
Или на бэкендах, поддерживающих оператор ILIKE:
a ILIKE other
Например:
stmt = select(sometable).\ where(sometable.c.column.ilike("%foobar%"))
- Параметры:
other – сравниваемое выражение
escape – необязательный управляющий символ, отображает ключевое слово
ESCAPE
, например:: somecolumn.ilike(«foo/%bar», escape=»/»)
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
in_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.in_()
методаColumnOperators
Реализовать оператор
in
.В контексте столбца порождает предложение
column IN <other>
.Заданный параметр
other
может быть:Список литеральных значений, например:
stmt.where(column.in_([1, 2, 3]))
В этой форме вызова список элементов преобразуется в набор связанных параметров той же длины, что и заданный список:
WHERE COL IN (?, ?, ?)
Если сравнение производится с
tuple_()
, содержащим несколько выражений, может быть предоставлен список кортежей:from sqlalchemy import tuple_ stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
Пустой список, например:
stmt.where(column.in_([]))
В этом вызывающем виде выражение выдает выражение «пустой набор». Эти выражения адаптированы к конкретным бэкендам и обычно пытаются получить пустой оператор SELECT в качестве подзапроса. Например, на SQLite это выражение имеет вид:
WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
Изменено в версии 1.4: Пустые выражения IN теперь во всех случаях используют генерируемый во время выполнения подзапрос SELECT.
Связанный параметр, например
bindparam()
, может быть использован, если он содержит флагbindparam.expanding
:stmt.where(column.in_(bindparam('value', expanding=True)))
В этом вызывающем виде выражение выдает специальное не-SQL выражение placeholder, имеющее вид:
WHERE COL IN ([EXPANDING_value])
Это выражение-заполнитель перехватывается во время выполнения оператора и преобразуется в форму переменной номера связанного параметра, показанную ранее. Если бы оператор был выполнен в виде:
connection.execute(stmt, {"value": [1, 2, 3]})
Для каждого значения базе данных будет передан связанный параметр:
WHERE COL IN (?, ?, ?)
Добавлено в версии 1.2: добавлены «расширяющие» параметры привязки
Если передается пустой список, то выводится специальное выражение «пустой список», характерное для используемой базы данных. Для SQLite это будет:
WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
Добавлено в версии 1.3: «Расширяющиеся» связанные параметры теперь поддерживают пустые списки
конструкция
select()
, которая обычно является коррелированным скаляром select:stmt.where( column.in_( select(othertable.c.y). where(table.c.x == othertable.c.x) ) )
В этой вызывающей форме
ColumnOperators.in_()
выглядит так:WHERE COL IN (SELECT othertable.y FROM othertable WHERE othertable.x = table.x)
- Параметры:
other – список литералов, конструкция
select()
или конструкцияbindparam()
, содержащая флагbindparam.expanding
, установленный в True.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
is_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_()
методаColumnOperators
Реализовать оператор
IS
.Обычно при сравнении со значением
IS
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS
.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
is_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_distinct_from()
методаColumnOperators
Реализовать оператор
IS DISTINCT FROM
.На большинстве платформ отображается «a IS DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS NOT b».
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
is_not(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_not()
методаColumnOperators
Реализовать оператор
IS NOT
.Обычно при сравнении со значением
IS NOT
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS NOT
.Изменено в версии 1.4: Оператор
is_not()
переименован изisnot()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
is_not_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.is_not_distinct_from()
методаColumnOperators
Реализовать оператор
IS NOT DISTINCT FROM
.На большинстве платформ отображается «a IS NOT DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS b».
Изменено в версии 1.4: Оператор
is_not_distinct_from()
переименован изisnot_distinct_from()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
isnot(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.isnot()
методаColumnOperators
Реализовать оператор
IS NOT
.Обычно при сравнении со значением
IS NOT
автоматически генерируетсяNone
, которое разрешается вNULL
. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использованиеIS NOT
.Изменено в версии 1.4: Оператор
is_not()
переименован изisnot()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
isnot_distinct_from(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.isnot_distinct_from()
методаColumnOperators
Реализовать оператор
IS NOT DISTINCT FROM
.На большинстве платформ отображается «a IS NOT DISTINCT FROM b»; на некоторых, таких как SQLite, может отображаться «a IS b».
Изменено в версии 1.4: Оператор
is_not_distinct_from()
переименован изisnot_distinct_from()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
istartswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.istartswith()
методаColumnOperators
Реализовать оператор
istartswith
, например, нечувствительный к регистру вариантColumnOperators.startswith()
.Выдает выражение LIKE, проверяющее нечувствительное совпадение начала строкового значения:
lower(column) LIKE lower(<other>) || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.istartswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.istartswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.istartswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.istartswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.istartswith(«foo%bar», autoescape=True) будет выглядеть так:: lower(somecolumn) LIKE lower(:param) || „%“ ESCAPE „/“ Со значением:param
в виде"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.istartswith(«foo/%bar», escape=»^») будет выглядеть так:: lower(somecolumn) LIKE lower(:param) || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.istartswith.autoescape
:: somecolumn.istartswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
like(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.like()
методаColumnOperators
Реализовать оператор
like
.В контексте столбца вырабатывается выражение:
a LIKE other
Например:
stmt = select(sometable).\ where(sometable.c.column.like("%foobar%"))
- Параметры:
other – сравниваемое выражение
escape – необязательный управляющий символ, отображает ключевое слово
ESCAPE
, например:: somecolumn.like(«foo/%bar», escape=»/»)
См.также
-
attribute
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
local_attr¶ наследуется от
AssociationProxyInstance.local_attr
атрибутаAssociationProxyInstance
Атрибут „локального“ класса, на который ссылается данный
AssociationProxyInstance
.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
match(other: Any, **kwargs: Any) ColumnOperators ¶ наследуется от
ColumnOperators.match()
методаColumnOperators
Реализует специфический для базы данных оператор „match“.
ColumnOperators.match()
пытается разрешиться в MATCH-подобную функцию или оператор, предоставляемый бэкендом. Примеры включают:PostgreSQL - выдает
x @@ plainto_tsquery(y)
Изменено в версии 2.0: Сейчас для PostgreSQL вместо
to_tsquery()
используетсяplainto_tsquery()
; для совместимости с другими формами см. Полнотекстовый поиск.MySQL - выдает
MATCH (x) AGAINST (y IN BOOLEAN MODE)
См.также
match
- специфическая для MySQL конструкция с дополнительными возможностями.Oracle - выдает
CONTAINS(x, y)
другие бэкенды могут предоставлять специальные реализации.
Бэкенды, не имеющие специальной реализации, будут выдавать оператор как «MATCH». Это совместимо, например, с SQLite.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
not_ilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.not_ilike()
методаColumnOperators
реализовать оператор
NOT ILIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.ilike()
, т.е.~x.ilike(y)
.Изменено в версии 1.4: Оператор
not_ilike()
переименован изnotilike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
not_in(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.not_in()
методаColumnOperators
реализовать оператор
NOT IN
.Это эквивалентно использованию отрицания с
ColumnOperators.in_()
, т.е.~x.in_(y)
.В случае, когда
other
является пустой последовательностью, компилятор выдает выражение «пусто не в». По умолчанию это выражение «1 = 1», которое во всех случаях выдает true. Для изменения этого поведения можно использоватьcreate_engine.empty_in_strategy
.Изменено в версии 1.4: Оператор
not_in()
переименован изnotin_()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.Изменено в версии 1.2: Операторы
ColumnOperators.in_()
иColumnOperators.not_in()
теперь по умолчанию выдают «статическое» выражение для пустой последовательности IN.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
not_like(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.not_like()
методаColumnOperators
реализовать оператор
NOT LIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.like()
, т.е.~x.like(y)
.Изменено в версии 1.4: Оператор
not_like()
переименован изnotlike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
notilike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.notilike()
методаColumnOperators
реализовать оператор
NOT ILIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.ilike()
, т.е.~x.ilike(y)
.Изменено в версии 1.4: Оператор
not_ilike()
переименован изnotilike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
notin_(other: Any) ColumnOperators ¶ наследуется от
ColumnOperators.notin_()
методаColumnOperators
реализовать оператор
NOT IN
.Это эквивалентно использованию отрицания с
ColumnOperators.in_()
, т.е.~x.in_(y)
.В случае, когда
other
является пустой последовательностью, компилятор выдает выражение «пусто не в». По умолчанию это выражение «1 = 1», которое во всех случаях выдает true. Для изменения этого поведения можно использоватьcreate_engine.empty_in_strategy
.Изменено в версии 1.4: Оператор
not_in()
переименован изnotin_()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.Изменено в версии 1.2: Операторы
ColumnOperators.in_()
иColumnOperators.not_in()
теперь по умолчанию выдают «статическое» выражение для пустой последовательности IN.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
notlike(other: Any, escape: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.notlike()
методаColumnOperators
реализовать оператор
NOT LIKE
.Это эквивалентно использованию отрицания с
ColumnOperators.like()
, т.е.~x.like(y)
.Изменено в версии 1.4: Оператор
not_like()
переименован изnotlike()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
nulls_first() ColumnOperators ¶ наследуется от
ColumnOperators.nulls_first()
методаColumnOperators
Произвести предложение
nulls_first()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_first()
переименован изnullsfirst()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
nulls_last() ColumnOperators ¶ наследуется от
ColumnOperators.nulls_last()
методаColumnOperators
Произвести предложение
nulls_last()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_last()
переименован изnullslast()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
nullsfirst() ColumnOperators ¶ наследуется от
ColumnOperators.nullsfirst()
методаColumnOperators
Произвести предложение
nulls_first()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_first()
переименован изnullsfirst()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
nullslast() ColumnOperators ¶ наследуется от
ColumnOperators.nullslast()
методаColumnOperators
Произвести предложение
nulls_last()
в отношении родительского объекта.Изменено в версии 1.4: Оператор
nulls_last()
переименован изnullslast()
в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Optional[Union[Type[TypeEngine[Any]], TypeEngine[Any]]] = None, python_impl: Optional[Callable[..., Any]] = None) Callable[[Any], Operators] ¶ наследуется от
Operators.op()
методаOperators
Вывести общую операторную функцию.
например:
somecolumn.op("*")(5)
производит:
somecolumn * 5
Эта функция также может быть использована для того, чтобы сделать побитовые операторы явными. Например:
somecolumn.op('&')(0xff)
является побитовым И из значения в
somecolumn
.- Параметры:
opstring – строка, которая будет выведена в качестве инфиксного оператора между данным элементом и выражением, переданным в генерируемую функцию.
precedence – приоритет, который база данных должна применять к оператору в SQL-выражениях. Это целочисленное значение служит подсказкой для компилятора SQL, когда следует использовать явные круглые скобки при выполнении той или иной операции. Меньшее число приводит к тому, что выражение будет заключено в круглые скобки, если оно применяется к другому оператору с более высоким старшинством. Значение по умолчанию
0
ниже всех операторов, кроме операторов запятой (,
) иAS
. Значение 100 будет выше или равно всем операторам, а -100 - ниже или равно всем операторам. … см. также:: Я использую op() для генерации пользовательского оператора, и мои скобки выходят неправильно - подробное описание того, как SQL-компилятор SQLAlchemy отображает круглые скобкиis_comparison – legacy; если True, то оператор будет рассматриваться как «оператор сравнения», то есть как оператор, который оценивается в булево значение true/false, например
==
,>
и т.д. Этот флаг устанавливается для того, чтобы ORM-отношения могли определить, что оператор является оператором сравнения, когда он используется в пользовательском условии объединения. Использование параметраis_comparison
заменяется использованием методаOperators.bool_op()
; этот более лаконичный оператор автоматически устанавливает этот параметр, а также обеспечивает корректную поддержку типа PEP 484, поскольку возвращаемый объект будет выражать тип данных «boolean», т.е.BinaryExpression[bool]
.return_type – класс или объект
TypeEngine
, который заставляет возвращать тип выражения, порожденного этим оператором, к данному типу. По умолчанию операторы, указывающиеOperators.op.is_comparison
, приводятся к типуBoolean
, а те, которые не приводятся, будут иметь тот же тип, что и левый операнд.python_impl – необязательная функция Python, которая может оценивать два значения Python таким же образом, как этот оператор работает на сервере базы данных. Используется для функций оценки выражений SQL в Python, например, для гибридных атрибутов ORM, а также для «оценщика» ORM, используемого для сопоставления объектов в сессии после многорядного обновления или удаления. например:: >>> expr = column(„x“).op(„+“, python_impl=lambda a, b: a + b)(„y“) Оператор для приведенного выражения будет работать и для не-SQL левых и правых объектов:: >>> expr.operator(5, 10) 15 … versionadded:: 2.0
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
operate(op: OperatorType, *other: Any, **kwargs: Any) ColumnElement[Any] ¶ Оперировать аргументом.
Это самый низкий уровень работы, по умолчанию поднимает
NotImplementedError
.Переопределение этого параметра в подклассе может позволить применять общее поведение для всех операций. Например, переопределение
ColumnOperators
позволяет применятьfunc.lower()
к левой и правой стороне:class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- Параметры:
op – Вызываемый оператор.
*other – «другая» сторона операции. Для большинства операций это будет один скаляр.
**kwargs – модификаторы. Они могут передаваться специальными операторами, такими как
ColumnOperators.contains()
.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
regexp_match(pattern: Any, flags: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.regexp_match()
методаColumnOperators
Реализует специфический для базы данных оператор „regexp match“.
Например:
stmt = select(table.c.some_column).where( table.c.some_column.regexp_match('^(b|c)') )
ColumnOperators.regexp_match()
пытается разрешиться в REGEXP-подобную функцию или оператор, предоставляемый бэкендом, однако конкретный синтаксис регулярных выражений и доступные флаги не зависят от бэкенда.Примеры включают:
PostgreSQL - при отрицании выдает
x ~ y
илиx !~ y
.Oracle - выдает
REGEXP_LIKE(x, y)
SQLite - использует оператор-заместитель SQLite
REGEXP
и обращается к встроенному модулю Pythonre.match()
.другие бэкенды могут предоставлять специальные реализации.
Бэкенды, не имеющие специальной реализации, будут выдавать оператор как «REGEXP» или «NOT REGEXP». Это совместимо, например, с SQLite и MySQL.
В настоящее время поддержка регулярных выражений реализована для Oracle, PostgreSQL, MySQL и MariaDB. Частичная поддержка имеется для SQLite. Поддержка диалектов сторонних разработчиков может отличаться.
- Параметры:
pattern – Строка шаблона регулярного выражения или предложение столбца.
flags – Любые флаги строк регулярных выражений для применения. Флаги, как правило, зависят от бэкенда. Это может быть строка или предложение столбца. Некоторые бэкенды, например, PostgreSQL и MariaDB, могут альтернативно указывать флаги как часть шаблона. При использовании флага игнорирования регистра „i“ в PostgreSQL будет использоваться оператор совпадения регэкспа
~*
или!~*
.
Добавлено в версии 1.4.
См.также
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
regexp_replace(pattern: Any, replacement: Any, flags: Optional[str] = None) ColumnOperators ¶ наследуется от
ColumnOperators.regexp_replace()
методаColumnOperators
Реализует специфический для базы данных оператор „regexp replace“.
Например:
stmt = select( table.c.some_column.regexp_replace( 'b(..)', 'XY', flags='g' ) )
ColumnOperators.regexp_replace()
пытается разрешиться в REGEXP_REPLACE-подобную функцию, предоставляемую бэкендом, который обычно выдает функциюREGEXP_REPLACE()
. Однако конкретный синтаксис регулярных выражений и доступные флаги не зависят от бэкенда.В настоящее время поддержка замены регулярных выражений реализована для Oracle, PostgreSQL, MySQL 8 и выше и MariaDB. Поддержка сторонних диалектов может отличаться.
- Параметры:
pattern – Строка шаблона регулярного выражения или предложение столбца.
pattern – Заменяющая строка или предложение столбца.
flags – Любые флаги строк регулярных выражений для применения. Флаги, как правило, зависят от бэкенда. Это может быть строка или предложение столбца. Некоторые бэкенды, например, PostgreSQL и MariaDB, могут альтернативно указывать флаги как часть шаблона.
Добавлено в версии 1.4.
См.также
-
attribute
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
remote_attr¶ наследуется от
AssociationProxyInstance.remote_attr
атрибутаAssociationProxyInstance
Атрибут класса „remote“, на который ссылается данный
AssociationProxyInstance
.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
reverse_operate(op: OperatorType, other: Any, **kwargs: Any) Operators ¶ наследуется от
Operators.reverse_operate()
методаOperators
Обратные операции над аргументом.
Используется так же, как и
operate()
.
-
attribute
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
scalar¶ наследуется от
AssociationProxyInstance.scalar
атрибутаAssociationProxyInstance
Возвращает
True
, если данныйAssociationProxyInstance
проксирует скалярное отношение на локальной стороне.
-
method
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
startswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) ColumnOperators ¶ наследуется от
ColumnOperators.startswith()
методаColumnOperators
Реализовать оператор
startswith
.Выдает выражение LIKE, проверяющее совпадение с началом строкового значения:
column LIKE <other> || '%'
Например:
stmt = select(sometable).\ where(sometable.c.column.startswith("foobar"))
Поскольку оператор использует
LIKE
, символы подстановки"%"
и"_"
, присутствующие внутри выражения <other>, также будут вести себя как символы подстановки. Для литеральных строковых значений флагColumnOperators.startswith.autoescape
может быть установлен в значениеTrue
, чтобы применить экранирование к вхождениям этих символов в строковое значение, чтобы они совпадали как сами по себе, а не как символы подстановки. В качестве альтернативы параметрColumnOperators.startswith.escape
устанавливает заданный символ как символ экранирования, что может быть полезно, когда целевое выражение не является литеральной строкой.- Параметры:
other – выражение для сравнения. Обычно это обычное строковое значение, но может быть и произвольное SQL-выражение. Символы подстановки LIKE
%
и_
по умолчанию не экранируются, если только флагColumnOperators.startswith.autoescape
не установлен в значение True.autoescape – boolean; при значении True устанавливает управляющий символ в выражении LIKE, затем применяет его ко всем вхождениям
"%"
,"_"
и самому управляющему символу в значении сравнения, которое предполагается как литеральная строка, а не как выражение SQL. Выражение типа:: somecolumn.startswith(«foo%bar», autoescape=True) будет выглядеть так:: somecolumn LIKE :param || „%“ ESCAPE „/“ Со значением:param
как"foo/%bar"
.escape – символ, который при задании будет отображаться с ключевым словом
ESCAPE
, чтобы установить этот символ в качестве управляющего. Затем этот символ может быть помещен перед вхождениями%
и_
, чтобы они действовали сами по себе, а не как символы подстановки. Выражение типа:: somecolumn.startswith(«foo/%bar», escape=»^») будет выглядеть так:: somecolumn LIKE :param || „%“ ESCAPE „^“ Параметр также может быть объединен сColumnOperators.startswith.autoescape
:: somecolumn.startswith(«foo%bar^bat», escape=»^», autoescape=True) Где выше, заданный литеральный параметр будет преобразован в"foo^%bar^^bat"
перед передачей в базу данных.
-
attribute
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
target_class: Type[Any]¶ Класс-посредник, с которым работает данный
AssociationProxyInstance
.Перехваченные события append/set/assignment приведут к генерации новых экземпляров этого класса.
-
attribute
sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.
timetuple: Literal[None] = None¶ наследуется от
ColumnOperators.timetuple
атрибутаColumnOperators
Hack, позволяет сравнивать объекты datetime на LHS.
-
method
- class sqlalchemy.ext.associationproxy.AssociationProxyExtensionType¶
Перечисление.
Members
Классическая подпись.
класс
sqlalchemy.ext.associationproxy.AssociationProxyExtensionType
(sqlalchemy.orm.base.InspectionAttrExtensionType
)-
attribute
sqlalchemy.ext.associationproxy.AssociationProxyExtensionType.
ASSOCIATION_PROXY = 'ASSOCIATION_PROXY'¶ Символ, указывающий на
InspectionAttr
, имеющий типAssociationProxy
.Присваивается атрибуту
InspectionAttr.extension_type
.
-
attribute