QueryOperations Класс

Пространство имен для операций запроса.

Доступ к ней осуществляется через client.query. Предоставляет операции запроса и поиска в таблицах Dataverse.

Пример:


   from PowerPlatform.Dataverse.models.filters import col

   client = DataverseClient(base_url, credential)

   # Fluent query builder (recommended)
   for record in (client.query.builder("account")
                  .select("name", "revenue")
                  .where(col("statecode") == 0)
                  .order_by("revenue", descending=True)
                  .top(100)
                  .execute()):
       print(record["name"])

   # SQL query
   rows = client.query.sql("SELECT TOP 10 name FROM account ORDER BY name")
   for row in rows:
       print(row["name"])

Конструктор

QueryOperations(client: DataverseClient)

Параметры

Имя Описание
client
Обязательно

Родительский DataverseClient экземпляр.

Методы

builder

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

Возвращает объект QueryBuilder , который можно связать с фильтром, выбором и порядком методов, а затем выполняться непосредственно с помощью .execute().

fetchxml

Возвращает инертный FetchXmlQuery объект.

Http-запрос не выполняется, пока execute или execute_pages не вызывается для возвращаемого объекта.

Используется для сценариев SQL-JOIN, агрегатных запросов или других операций, которые не могут выразить конечная точка конструктора OData.

Пример:


   query = client.query.fetchxml("""
     <fetch top="50">
       <entity name="account">
         <attribute name="name" />
         <link-entity name="contact" from="parentcustomerid"
                      to="accountid" alias="c" link-type="inner">
           <attribute name="fullname" />
         </link-entity>
       </entity>
     </fetch>
   """)

   # Eager — collect all pages:
   result = query.execute()
   df = result.to_dataframe()

   # Lazy — process one page at a time:
   for page in query.execute_pages():
       process(page.to_dataframe())
odata_bind

@odata.bind Создайте запись для задания поля подстановки.

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

Пример:


   # Instead of manually constructing:
   #   {"parentcustomerid_account@odata.bind": "/accounts(guid)"}
   # Just do:
   bind = client.query.odata_bind("contact", "account", acct_id)
   client.records.create("contact", {
       "firstname": "Jane",
       "lastname": "Doe",
       **bind,
   })
odata_expand

Возвращает имя $expand свойства навигации из одной таблицы в другую.

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

Пример:


   nav = client.query.odata_expand("contact", "account")
   # Returns e.g. "parentcustomerid_account"
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[nav],
                                  top=5):
       for r in page:
           acct = r.get(nav) or {}
           print(f"{r['fullname']} -> {acct.get('name', 'N/A')}")
odata_expands

Обнаружение всех $expand свойств навигации из таблицы.

Возвращает записи для каждой исходящей подстановки (однозначное свойство навигации). Каждая запись содержит точное имя свойства навигации PascalCase, необходимое для $expand и @odata.bind, а также имя целевого набора сущностей.

Пример:


   expands = client.query.odata_expands("contact")
   for e in expands:
       print(f"expand={e['nav_property']}  -> {e['target_table']}")

   # Use in a query
   e = next(e for e in expands if e['target_table'] == 'account')
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[e['nav_property']]):
       ...
odata_select

Возвращает список логических имен столбцов, подходящих для $select.

Может передаваться напрямую client.records.get(table, select=...)в .

Пример:


   cols = client.query.odata_select("account")
   for page in client.records.get("account", select=cols, top=10):
       for r in page:
           print(r)
sql

Выполните sql-запрос только для чтения с помощью веб-API Dataverse.

Конечная точка Dataverse SQL поддерживает широкий подмножество T-SQL:


   SELECT / SELECT DISTINCT / SELECT TOP N (0-5000)
   FROM table [alias]
   INNER JOIN / LEFT JOIN (multi-table, no depth limit)
   WHERE (=, !=, >, <, >=, <=, LIKE, IN, NOT IN, IS NULL,
          IS NOT NULL, BETWEEN, AND, OR, nested parentheses)
   GROUP BY column
   ORDER BY column [ASC|DESC]
   OFFSET n ROWS FETCH NEXT m ROWS ONLY
   COUNT(*), SUM(), AVG(), MIN(), MAX()

SELECT * не поддерживается— явно укажите имена столбцов. Используется sql_columns для обнаружения доступных имен столбцов для таблицы.

Не поддерживается: SELECT >>*<<, вложенные запросы, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, функции окна, строки/даты/математические функции, INSERT/UPDATE/DELETE. Для операций записи используйте client.records методы.

sql_columns

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

Каждый дикт содержит name (логическое имя для SQL), (тип атрибута Dataverse), is_pktype (флаг первичного ключа) и label (отображаемое имя). Виртуальные столбцы всегда исключаются, так как конечная точка SQL не может запрашивать их.

Пример:


   cols = client.query.sql_columns("account")
   for c in cols:
       print(f"{c['name']:30s} {c['type']:20s} PK={c['is_pk']}")

builder

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

Возвращает объект QueryBuilder , который можно связать с фильтром, выбором и порядком методов, а затем выполняться непосредственно с помощью .execute().

builder(table: str) -> QueryBuilder

Параметры

Имя Описание
table
Обязательно
str

Имя схемы таблицы (например, "account").

Возвращаемое значение

Тип Описание

Экземпляр QueryBuilder, привязанный к этому клиенту.

Примеры

Создайте и выполните запрос без изменений:


   from PowerPlatform.Dataverse.models.filters import col

   for record in (client.query.builder("account")
                  .select("name", "revenue")
                  .where(col("statecode") == 0)
                  .where(col("revenue") > 1_000_000)
                  .order_by("revenue", descending=True)
                  .top(100)
                  .page_size(50)
                  .execute()):
       print(record["name"])

С деревом компонуемых выражений:


   from PowerPlatform.Dataverse.models.filters import col

   for record in (client.query.builder("account")
                  .where((col("statecode") == 0) | (col("statecode") == 1))
                  .where(col("revenue") > 100_000)
                  .execute()):
       print(record["name"])

fetchxml

Возвращает инертный FetchXmlQuery объект.

Http-запрос не выполняется, пока execute или execute_pages не вызывается для возвращаемого объекта.

Используется для сценариев SQL-JOIN, агрегатных запросов или других операций, которые не могут выразить конечная точка конструктора OData.

Пример:


   query = client.query.fetchxml("""
     <fetch top="50">
       <entity name="account">
         <attribute name="name" />
         <link-entity name="contact" from="parentcustomerid"
                      to="accountid" alias="c" link-type="inner">
           <attribute name="fullname" />
         </link-entity>
       </entity>
     </fetch>
   """)

   # Eager — collect all pages:
   result = query.execute()
   df = result.to_dataframe()

   # Lazy — process one page at a time:
   for page in query.execute_pages():
       process(page.to_dataframe())
fetchxml(xml: str) -> FetchXmlQuery

Параметры

Имя Описание
xml
Обязательно
str

Хорошо сформированная строка запроса FetchXML. Корневой <entity name="..."> элемент определяет конечную точку набора сущностей.

Возвращаемое значение

Тип Описание

Объект запроса inert с .execute() методами и .execute_pages() методами.

Исключения

Тип Описание

Если FetchXML отсутствует корневой <entity> элемент или атрибут сущности name .

odata_bind

@odata.bind Создайте запись для задания поля подстановки.

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

Пример:


   # Instead of manually constructing:
   #   {"parentcustomerid_account@odata.bind": "/accounts(guid)"}
   # Just do:
   bind = client.query.odata_bind("contact", "account", acct_id)
   client.records.create("contact", {
       "firstname": "Jane",
       "lastname": "Doe",
       **bind,
   })
odata_bind(from_table: str, to_table: str, target_id: str) -> Dict[str, str]

Параметры

Имя Описание
from_table
Обязательно
str

Имя схемы создаваемой или обновленной сущности.

to_table
Обязательно
str

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

target_id
Обязательно
str

GUID целевой записи.

Возвращаемое значение

Тип Описание

Дикт, как {"NavProp@odata.bind": "/entityset(guid)"}.

Исключения

Тип Описание

Если связь между таблицами не найдена.

odata_expand

Возвращает имя $expand свойства навигации из одной таблицы в другую.

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

Пример:


   nav = client.query.odata_expand("contact", "account")
   # Returns e.g. "parentcustomerid_account"
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[nav],
                                  top=5):
       for r in page:
           acct = r.get(nav) or {}
           print(f"{r['fullname']} -> {acct.get('name', 'N/A')}")
odata_expand(from_table: str, to_table: str) -> str

Параметры

Имя Описание
from_table
Обязательно
str

Имя схемы исходной таблицы (например, "contact").

to_table
Обязательно
str

Имя схемы целевой таблицы (например, "account").

Возвращаемое значение

Тип Описание
str

Имя свойства навигации (PascalCase).

Исключения

Тип Описание

Если для целевого объекта не найдено свойства навигации.

odata_expands

Обнаружение всех $expand свойств навигации из таблицы.

Возвращает записи для каждой исходящей подстановки (однозначное свойство навигации). Каждая запись содержит точное имя свойства навигации PascalCase, необходимое для $expand и @odata.bind, а также имя целевого набора сущностей.

Пример:


   expands = client.query.odata_expands("contact")
   for e in expands:
       print(f"expand={e['nav_property']}  -> {e['target_table']}")

   # Use in a query
   e = next(e for e in expands if e['target_table'] == 'account')
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[e['nav_property']]):
       ...
odata_expands(table: str) -> List[Dict[str, Any]]

Параметры

Имя Описание
table
Обязательно
str

Имя схемы таблицы (например, "contact").

Возвращаемое значение

Тип Описание

Список диктовок, каждый из которых содержит:

  • nav_property — свойство навигации PascalCase для $expand

  • target_table — логическое имя целевой сущности

  • target_entity_set — целевой набор сущностей (для @odata.bind)

  • lookup_attribute — логическое имя столбца подстановки

  • relationship — имя схемы связи

odata_select

Возвращает список логических имен столбцов, подходящих для $select.

Может передаваться напрямую client.records.get(table, select=...)в .

Пример:


   cols = client.query.odata_select("account")
   for page in client.records.get("account", select=cols, top=10):
       for r in page:
           print(r)
odata_select(table: str, *, include_system: bool = False) -> List[str]

Параметры

Имя Описание
table
Обязательно
str

Имя схемы таблицы (например, "account").

include_system
Обязательно

Включить системные столбцы (по умолчанию False).

Параметры Keyword-Only

Имя Описание
include_system
Default value: False

Возвращаемое значение

Тип Описание

Список логических имен столбцов нижнего регистра.

sql

Выполните sql-запрос только для чтения с помощью веб-API Dataverse.

Конечная точка Dataverse SQL поддерживает широкий подмножество T-SQL:


   SELECT / SELECT DISTINCT / SELECT TOP N (0-5000)
   FROM table [alias]
   INNER JOIN / LEFT JOIN (multi-table, no depth limit)
   WHERE (=, !=, >, <, >=, <=, LIKE, IN, NOT IN, IS NULL,
          IS NOT NULL, BETWEEN, AND, OR, nested parentheses)
   GROUP BY column
   ORDER BY column [ASC|DESC]
   OFFSET n ROWS FETCH NEXT m ROWS ONLY
   COUNT(*), SUM(), AVG(), MIN(), MAX()

SELECT * не поддерживается— явно укажите имена столбцов. Используется sql_columns для обнаружения доступных имен столбцов для таблицы.

Не поддерживается: SELECT >>*<<, вложенные запросы, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, функции окна, строки/даты/математические функции, INSERT/UPDATE/DELETE. Для операций записи используйте client.records методы.

sql(sql: str) -> List[Record]

Параметры

Имя Описание
sql
Обязательно
str

Поддерживаемая инструкция SQL SELECT.

Возвращаемое значение

Тип Описание

Record Список объектов. Возвращает пустой список, если строки не совпадают.

Исключения

Тип Описание

Если sql строка не является или пуста.

Примеры

Базовый запрос:


   rows = client.query.sql(
       "SELECT TOP 10 name FROM account ORDER BY name"
   )

JOIN с агрегированием:


   rows = client.query.sql(
       "SELECT a.name, COUNT(c.contactid) as cnt "
       "FROM account a "
       "JOIN contact c ON a.accountid = c.parentcustomerid "
       "GROUP BY a.name"
   )

sql_columns

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

Каждый дикт содержит name (логическое имя для SQL), (тип атрибута Dataverse), is_pktype (флаг первичного ключа) и label (отображаемое имя). Виртуальные столбцы всегда исключаются, так как конечная точка SQL не может запрашивать их.

Пример:


   cols = client.query.sql_columns("account")
   for c in cols:
       print(f"{c['name']:30s} {c['type']:20s} PK={c['is_pk']}")
sql_columns(table: str, *, include_system: bool = False) -> List[Dict[str, Any]]

Параметры

Имя Описание
table
Обязательно
str

Имя схемы таблицы (например, "account").

include_system
Обязательно

Если False (по умолчанию) столбцы, заканчивающиеся общими системными суффиксами (_base, versionnumber, timezoneruleversionnumber, utcconversiontimezonecode, importsequencenumber) overriddencreatedonисключаются.

Параметры Keyword-Only

Имя Описание
include_system
Default value: False

Возвращаемое значение

Тип Описание

Список диктовки метаданных столбца.