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 , который можно связать с фильтром, выбором и порядком методов, а затем выполняться непосредственно с помощью |
| fetchxml |
Возвращает инертный FetchXmlQuery объект. Http-запрос не выполняется, пока execute или execute_pages не вызывается для возвращаемого объекта. Используется для сценариев SQL-JOIN, агрегатных запросов или других операций, которые не могут выразить конечная точка конструктора OData. Пример:
|
| odata_bind |
Автоматически обнаруживает имя свойства навигации и имя набора сущностей из метаданных. Возвращает единый дикт, который можно объединить в полезные данные создания или обновления. Пример:
|
| odata_expand |
Возвращает имя Обнаруживается с помощью метаданных связи. Возвращает точную строку PascalCase для Пример:
|
| odata_expands |
Обнаружение всех Возвращает записи для каждой исходящей подстановки (однозначное свойство навигации). Каждая запись содержит точное имя свойства навигации PascalCase, необходимое для Пример:
|
| odata_select |
Возвращает список логических имен столбцов, подходящих для Может передаваться напрямую Пример:
|
| sql |
Выполните sql-запрос только для чтения с помощью веб-API Dataverse. Конечная точка Dataverse SQL поддерживает широкий подмножество T-SQL:
Не поддерживается: SELECT >>*<<, вложенные запросы, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, функции окна, строки/даты/математические функции, INSERT/UPDATE/DELETE. Для операций записи используйте |
| sql_columns |
Возвращает упрощенный список столбцов, доступных для использования SQL, для таблицы. Каждый дикт содержит Пример:
|
builder
Создайте построитель текучих запросов для указанной таблицы.
Возвращает объект QueryBuilder , который можно связать с фильтром, выбором и порядком методов, а затем выполняться непосредственно с помощью .execute().
builder(table: str) -> QueryBuilder
Параметры
| Имя | Описание |
|---|---|
|
table
Обязательно
|
Имя схемы таблицы (например, |
Возвращаемое значение
| Тип | Описание |
|---|---|
|
Экземпляр 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
Обязательно
|
Хорошо сформированная строка запроса FetchXML. Корневой |
Возвращаемое значение
| Тип | Описание |
|---|---|
|
Объект запроса inert с |
Исключения
| Тип | Описание |
|---|---|
|
Если FetchXML отсутствует корневой |
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
Обязательно
|
Имя схемы создаваемой или обновленной сущности. |
|
to_table
Обязательно
|
Имя схемы целевой сущности, на который указывает поиск. |
|
target_id
Обязательно
|
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
Обязательно
|
Имя схемы исходной таблицы (например, |
|
to_table
Обязательно
|
Имя схемы целевой таблицы (например, |
Возвращаемое значение
| Тип | Описание |
|---|---|
|
Имя свойства навигации (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
Обязательно
|
Имя схемы таблицы (например, |
Возвращаемое значение
| Тип | Описание |
|---|---|
|
Список диктовок, каждый из которых содержит:
|
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
Обязательно
|
Имя схемы таблицы (например, |
|
include_system
Обязательно
|
Включить системные столбцы (по умолчанию |
Параметры 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
Обязательно
|
Поддерживаемая инструкция SQL SELECT. |
Возвращаемое значение
| Тип | Описание |
|---|---|
|
Record Список объектов. Возвращает пустой список, если строки не совпадают. |
Исключения
| Тип | Описание |
|---|---|
|
Если |
Примеры
Базовый запрос:
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
Обязательно
|
Имя схемы таблицы (например, |
|
include_system
Обязательно
|
Если |
Параметры Keyword-Only
| Имя | Описание |
|---|---|
|
include_system
|
Default value: False
|
Возвращаемое значение
| Тип | Описание |
|---|---|
|
Список диктовки метаданных столбца. |