Доверенность Ассоциации

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, реализующее представление атрибута цели, которое ссылается на атрибут членов цели.

AssociationProxy

Дескриптор, представляющий представление атрибута объекта в режиме чтения/записи.

AssociationProxyExtensionType

Перечисление.

AssociationProxyInstance

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

ColumnAssociationProxyInstance

AssociationProxyInstance, имеющий в качестве цели столбец базы данных.

ObjectAssociationProxyInstance

AssociationProxyInstance, имеющий в качестве цели объект.

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.0b4

  • repr – Специфично для Декларативное отображение классов данных, указывает, должен ли атрибут, установленный этим AssociationProxy, быть частью метода __repr__(), генерируемого процессом класса данных. … versionadded:: 2.0.0b4

  • default_factory – Специфично для Декларативное отображение классов данных, задает функцию генерации значения по умолчанию, которая будет происходить в рамках метода __init__(), генерируемого процессом dataclass. … versionadded:: 2.0.0b4

  • compare – Специфично для Декларативное отображение классов данных, указывает, должно ли это поле включаться в операции сравнения при генерации методов __eq__() и __ne__() для сопоставленного класса. … versionadded:: 2.0.0b4

  • kw_only – Специфично для Декларативное отображение классов данных, указывает, должно ли это поле быть помечено как предназначенное только для ключевого слова при генерации метода __init__(), генерируемого процессом dataclass. … versionadded:: 2.0.0b4

  • info – необязательный, при наличии присваивается AssociationProxy.info.

Следующие дополнительные параметры предполагают внедрение пользовательского поведения в объект AssociationProxy и предназначены только для расширенного использования:

Параметры:
  • getset_factory – Необязательно. Доступ к прокси-атрибутам автоматически обрабатывается функциями, которые получают и устанавливают значения на основе аргумента attr для данного прокси. Если вы хотите настроить это поведение, вы можете предоставить вызываемую фабрику getset_factory, которая производит кортеж функций getter и setter. Фабрика вызывается с двумя аргументами - абстрактным типом базовой коллекции и данным экземпляром прокси.

  • proxy_factory – Необязательно. Тип эмулируемой коллекции определяется путем обнюхивания целевой коллекции. Если тип коллекции не может быть определен с помощью утиной типизации или вы хотите использовать другую реализацию коллекции, вы можете предоставить фабричную функцию для создания таких коллекций. Применимо только для нескалярных отношений.

  • proxy_bulk_set – Необязательно, используется с proxy_factory.

class sqlalchemy.ext.associationproxy.AssociationProxy

Дескриптор, представляющий представление атрибута объекта в режиме чтения/записи.

Классическая подпись.

класс 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-class AssociationProxyInstance 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 будет ссылаться на константу, идентифицирующую конкретный подтип.

См.также

Mapper.all_orm_descriptors

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
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.

Классическая подпись.

класс 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.

См.также

Operators.op()

method sqlalchemy.ext.associationproxy.AssociationProxyInstance.collate(collation: str) ColumnOperators

наследуется от ColumnOperators.collate() метода ColumnOperators

Вывести предложение collate() для родительского объекта, заданного строкой collation.

См.также

collate()

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" перед передачей в базу данных.

См.также

ColumnOperators.contains()

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" перед передачей в базу данных.

См.также

ColumnOperators.endswith()

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=»/»)

См.также

ColumnOperators.like()

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.

attribute sqlalchemy.ext.associationproxy.AssociationProxyInstance.info
method sqlalchemy.ext.associationproxy.AssociationProxyInstance.is_(other: Any) ColumnOperators

наследуется от ColumnOperators.is_() метода ColumnOperators

Реализовать оператор IS.

Обычно при сравнении со значением IS автоматически генерируется None, которое разрешается в NULL. Однако при сравнении с булевыми значениями на некоторых платформах может оказаться желательным явное использование IS.

См.также

ColumnOperators.is_not()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.is_()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.is_()

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=»/»)

См.также

ColumnOperators.ilike()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.ilike()

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.

См.также

ColumnOperators.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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.like()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.ilike()

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.

См.также

ColumnOperators.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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.like()

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 и обращается к встроенному модулю Python re.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.

class sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance

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.

См.также

Operators.op()

method sqlalchemy.ext.associationproxy.ObjectAssociationProxyInstance.collate(collation: str) ColumnOperators

наследуется от ColumnOperators.collate() метода ColumnOperators

Вывести предложение collate() для родительского объекта, заданного строкой collation.

См.также

collate()

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" перед передачей в базу данных.

См.также

ColumnOperators.contains()

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" перед передачей в базу данных.

См.также

ColumnOperators.endswith()

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=»/»)

См.также

ColumnOperators.like()

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.

См.также

ColumnOperators.is_not()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.is_()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.is_()

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=»/»)

См.также

ColumnOperators.ilike()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.ilike()

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.

См.также

ColumnOperators.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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.like()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.ilike()

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.

См.также

ColumnOperators.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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.like()

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 и обращается к встроенному модулю Python re.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.

class sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance

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.

См.также

Operators.op()

method sqlalchemy.ext.associationproxy.ColumnAssociationProxyInstance.collate(collation: str) ColumnOperators

наследуется от ColumnOperators.collate() метода ColumnOperators

Вывести предложение collate() для родительского объекта, заданного строкой collation.

См.также

collate()

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" перед передачей в базу данных.

См.также

ColumnOperators.contains()

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" перед передачей в базу данных.

См.также

ColumnOperators.endswith()

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=»/»)

См.также

ColumnOperators.like()

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.

См.также

ColumnOperators.is_not()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.is_()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.is_()

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=»/»)

См.также

ColumnOperators.ilike()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.ilike()

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.

См.также

ColumnOperators.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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.like()

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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.ilike()

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.

См.также

ColumnOperators.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() в предыдущих выпусках. Прежнее название остается доступным для обратной совместимости.

См.также

ColumnOperators.like()

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 и обращается к встроенному модулю Python re.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.

class sqlalchemy.ext.associationproxy.AssociationProxyExtensionType

Перечисление.

attribute sqlalchemy.ext.associationproxy.AssociationProxyExtensionType.ASSOCIATION_PROXY = 'ASSOCIATION_PROXY'

Символ, указывающий на InspectionAttr, имеющий тип AssociationProxy.

Присваивается атрибуту InspectionAttr.extension_type.

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