QueryOperations Classe

Namespace para operações de consulta.

Acedido via client.query. Fornece operações de consulta e pesquisa contra tabelas Dataverse.

Exemplo:


   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"])

Construtor

QueryOperations(client: DataverseClient)

Parâmetros

Name Description
client
Necessário

A instância principal DataverseClient .

Métodos

builder

Crie um construtor de consultas fluente para a tabela especificada.

Retorna um QueryBuilder que pode ser encadeado com métodos filtro, select e order, e depois executado diretamente via .execute().

fetchxml

Devolva um objeto inerte FetchXmlQuery .

Nenhum pedido HTTP é feito até execute ou execute_pages é chamado no objeto devolvido.

Use para SQL-JOIN cenários, consultas agregadas ou outras operações que o endpoint OData builder não consiga expressar.

Exemplo:


   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

Crie uma @odata.bind entrada para definir um campo de pesquisa.

Descobre automaticamente o nome da propriedade de navegação e o nome do conjunto de entidades a partir dos metadados. Devolve um dicto de entrada única que pode ser fundido numa carga útil de criar ou atualizar.

Exemplo:


   # 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

Devolva o nome da propriedade de navegação de $expand uma tabela para outra.

Descobre através dos metadados da relação. Devolve a cadeia exata de PascalCase para o expand= parâmetro.

Exemplo:


   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

Descubra todas as $expand propriedades de navegação a partir de uma tabela.

Retorna entradas para cada consulta de saída (propriedade de navegação de valor único). Cada entrada contém o nome exato da propriedade de navegação PascalCase necessário para $expand e @odata.bind, mais o nome do conjunto de entidade-alvo.

Exemplo:


   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

Devolva uma lista de nomes lógicos de colunas adequada para $select.

Pode ser passada diretamente para client.records.get(table, select=...).

Exemplo:


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

Execute uma consulta SQL apenas de leitura usando a API Web do Dataverse.

O endpoint SQL do Dataverse suporta um amplo subconjunto do 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 * não é suportado – especifique explicitamente os nomes das colunas. Use sql_columns para descobrir os nomes das colunas disponíveis para uma tabela.

Não suportado: SELECT >>*<<, subqueries, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, funções janela, string/date/math, INSERT/UPDATE/DELETE. Para escritas, usa client.records métodos.

sql_columns

Devolva uma lista simplificada de colunas utilizáveis em SQL para uma tabela.

Cada dict contém name (nome lógico para SQL), type (tipo de atributo Dataverse), is_pk (flag de chave primária) e label (nome de exibição). As colunas virtuais são sempre excluídas porque o endpoint SQL não as pode consultar.

Exemplo:


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

builder

Crie um construtor de consultas fluente para a tabela especificada.

Retorna um QueryBuilder que pode ser encadeado com métodos filtro, select e order, e depois executado diretamente via .execute().

builder(table: str) -> QueryBuilder

Parâmetros

Name Description
table
Necessário
str

Nome do esquema da tabela (por exemplo, "account").

Devoluções

Tipo Description

Uma instância QueryBuilder vinculada a este cliente.

Exemplos

Construa e execute uma consulta de forma fluida:


   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"])

Com árvore de expressões componível:


   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

Devolva um objeto inerte FetchXmlQuery .

Nenhum pedido HTTP é feito até execute ou execute_pages é chamado no objeto devolvido.

Use para SQL-JOIN cenários, consultas agregadas ou outras operações que o endpoint OData builder não consiga expressar.

Exemplo:


   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

Parâmetros

Name Description
xml
Necessário
str

String de consulta FetchXML bem formada. O elemento raiz <entity name="..."> determina o ponto final do conjunto de entidades.

Devoluções

Tipo Description

Objeto de consulta inerte com .execute() e .execute_pages() métodos.

Exceções

Tipo Description

Se o FetchXML estiver em falta de um elemento raiz <entity> ou do atributo entity name .

odata_bind

Crie uma @odata.bind entrada para definir um campo de pesquisa.

Descobre automaticamente o nome da propriedade de navegação e o nome do conjunto de entidades a partir dos metadados. Devolve um dicto de entrada única que pode ser fundido numa carga útil de criar ou atualizar.

Exemplo:


   # 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]

Parâmetros

Name Description
from_table
Necessário
str

Nome do esquema da entidade a ser criada/atualizada.

to_table
Necessário
str

Nome do esquema da entidade-alvo para a qual a consulta aponta.

target_id
Necessário
str

GUID do registo alvo.

Devoluções

Tipo Description

Um ditto como {"NavProp@odata.bind": "/entityset(guid)"}.

Exceções

Tipo Description

Se não for encontrada relação entre as tabelas.

odata_expand

Devolva o nome da propriedade de navegação de $expand uma tabela para outra.

Descobre através dos metadados da relação. Devolve a cadeia exata de PascalCase para o expand= parâmetro.

Exemplo:


   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

Parâmetros

Name Description
from_table
Necessário
str

Nome do esquema da tabela fonte (por exemplo, "contact").

to_table
Necessário
str

Nome do esquema da tabela alvo (por exemplo, "account").

Devoluções

Tipo Description
str

O nome da propriedade de navegação (PascalCase).

Exceções

Tipo Description

Se não for encontrada nenhuma propriedade de navegação para o alvo.

odata_expands

Descubra todas as $expand propriedades de navegação a partir de uma tabela.

Retorna entradas para cada consulta de saída (propriedade de navegação de valor único). Cada entrada contém o nome exato da propriedade de navegação PascalCase necessário para $expand e @odata.bind, mais o nome do conjunto de entidade-alvo.

Exemplo:


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

Parâmetros

Name Description
table
Necessário
str

Nome do esquema da tabela (por exemplo, "contact").

Devoluções

Tipo Description

Lista de ditados, cada um com:

  • nav_property – Propriedade de navegação PascalCase para $expand

  • target_table – nome lógico da entidade-alvo

  • target_entity_set – conjunto de entidades-alvo (para @odata.bind)

  • lookup_attribute – o nome lógico da coluna de pesquisa

  • relationship – nome do esquema de relações

odata_select

Devolva uma lista de nomes lógicos de colunas adequada para $select.

Pode ser passada diretamente para client.records.get(table, select=...).

Exemplo:


   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]

Parâmetros

Name Description
table
Necessário
str

Nome do esquema da tabela (por exemplo, "account").

include_system
Necessário

Incluir colunas do sistema (por defeito False).

Parâmetros Só de Palavra-Chave

Name Description
include_system
Default value: False

Devoluções

Tipo Description

Lista de nomes lógicos em colunas minúsculas.

sql

Execute uma consulta SQL apenas de leitura usando a API Web do Dataverse.

O endpoint SQL do Dataverse suporta um amplo subconjunto do 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 * não é suportado – especifique explicitamente os nomes das colunas. Use sql_columns para descobrir os nomes das colunas disponíveis para uma tabela.

Não suportado: SELECT >>*<<, subqueries, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, funções janela, string/date/math, INSERT/UPDATE/DELETE. Para escritas, usa client.records métodos.

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

Parâmetros

Name Description
sql
Necessário
str

Instrução SQL SELECT suportada.

Devoluções

Tipo Description

Lista de Record objetos. Devolve uma lista vazia quando nenhuma linha corresponde.

Exceções

Tipo Description

Se sql não for uma cadeia ou estiver vazia.

Exemplos

Consulta básica:


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

JUNTE-SE com agregação:


   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

Devolva uma lista simplificada de colunas utilizáveis em SQL para uma tabela.

Cada dict contém name (nome lógico para SQL), type (tipo de atributo Dataverse), is_pk (flag de chave primária) e label (nome de exibição). As colunas virtuais são sempre excluídas porque o endpoint SQL não as pode consultar.

Exemplo:


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

Parâmetros

Name Description
table
Necessário
str

Nome do esquema da tabela (por exemplo, "account").

include_system
Necessário

Quando False (padrão), colunas que terminam com sufixos comuns do sistema (_base, versionnumber, timezoneruleversionnumber, utcconversiontimezonecode, importsequencenumber, ) overriddencreatedonsão excluídas.

Parâmetros Só de Palavra-Chave

Name Description
include_system
Default value: False

Devoluções

Tipo Description

Lista de ditos de metadados das colunas.