QueryOperations Classe
Spazio dei nomi per le operazioni di query.
Accesso tramite client.query. Fornisce operazioni di query e ricerca su tabelle dataverse.
Esempio:
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"])
Costruttore
QueryOperations(client: DataverseClient)
Parametri
| Nome | Descrizione |
|---|---|
|
client
Necessario
|
Istanza padre DataverseClient . |
Metodi
| builder |
Creare un generatore di query Fluent per la tabella specificata. Restituisce un oggetto QueryBuilder che può essere concatenato con i metodi di filtro, selezione e ordine, quindi eseguiti direttamente tramite |
| fetchxml |
Restituisce un oggetto inert FetchXmlQuery . Non viene effettuata alcuna richiesta HTTP finché execute non viene chiamato o execute_pages sull'oggetto restituito. Usare per scenari SQL-JOIN, query di aggregazione o altre operazioni che l'endpoint del generatore OData non può esprimere. Esempio:
|
| odata_bind |
Compilare una Individua automaticamente il nome della proprietà di navigazione e il nome del set di entità dai metadati. Restituisce un dict a voce singola che può essere unito in un payload di creazione o aggiornamento. Esempio:
|
| odata_expand |
Restituisce il nome della proprietà di navigazione da Individua tramite i metadati delle relazioni. Restituisce la stringa PascalCase esatta per il Esempio:
|
| odata_expands |
Individuare tutte le Restituisce le voci per ogni ricerca in uscita (proprietà di navigazione a valore singolo). Ogni voce contiene il nome esatto della proprietà di navigazione PascalCase necessaria per Esempio:
|
| odata_select |
Restituisce un elenco di nomi logici di colonna adatti per Può essere passato direttamente a Esempio:
|
| sql |
Eseguire una query SQL di sola lettura usando l'API Web Dataverse. L'endpoint SQL di Dataverse supporta un ampio subset di T-SQL:
Non supportato: SELECT >>*<<, sottoquery, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, funzioni finestra, funzioni stringa/data/matematica, INSERT/UPDATE/DELETE. Per le scritture, usare |
| sql_columns |
Restituisce un elenco semplificato di colonne utilizzabili da SQL per una tabella. Ogni dict contiene Esempio:
|
builder
Creare un generatore di query Fluent per la tabella specificata.
Restituisce un oggetto QueryBuilder che può essere concatenato con i metodi di filtro, selezione e ordine, quindi eseguiti direttamente tramite .execute().
builder(table: str) -> QueryBuilder
Parametri
| Nome | Descrizione |
|---|---|
|
table
Necessario
|
Nome dello schema di tabella ,ad esempio |
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Istanza di QueryBuilder associata a questo client. |
Esempio
Compilare ed eseguire una query in modo fluente:
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"])
Con l'albero delle espressioni componibili:
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
Restituisce un oggetto inert FetchXmlQuery .
Non viene effettuata alcuna richiesta HTTP finché execute non viene chiamato o execute_pages sull'oggetto restituito.
Usare per scenari SQL-JOIN, query di aggregazione o altre operazioni che l'endpoint del generatore OData non può esprimere.
Esempio:
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
Parametri
| Nome | Descrizione |
|---|---|
|
xml
Necessario
|
Stringa di query FetchXML ben formata. L'elemento radice |
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Oggetto query inert con |
Eccezioni
| Tipo | Descrizione |
|---|---|
|
Se FetchXML manca un elemento radice |
odata_bind
Compilare una @odata.bind voce per impostare un campo di ricerca.
Individua automaticamente il nome della proprietà di navigazione e il nome del set di entità dai metadati. Restituisce un dict a voce singola che può essere unito in un payload di creazione o aggiornamento.
Esempio:
# 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]
Parametri
| Nome | Descrizione |
|---|---|
|
from_table
Necessario
|
Nome dello schema dell'entità da creare/aggiornare. |
|
to_table
Necessario
|
Nome dello schema dell'entità di destinazione a cui punta la ricerca. |
|
target_id
Necessario
|
GUID del record di destinazione. |
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Un dict come |
Eccezioni
| Tipo | Descrizione |
|---|---|
|
Se non viene trovata alcuna relazione tra le tabelle. |
odata_expand
Restituisce il nome della proprietà di navigazione da $expand una tabella a un'altra.
Individua tramite i metadati delle relazioni. Restituisce la stringa PascalCase esatta per il expand= parametro .
Esempio:
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
Parametri
| Nome | Descrizione |
|---|---|
|
from_table
Necessario
|
Nome dello schema della tabella di origine ,ad esempio |
|
to_table
Necessario
|
Nome dello schema della tabella di destinazione ,ad esempio |
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Nome della proprietà di navigazione (PascalCase). |
Eccezioni
| Tipo | Descrizione |
|---|---|
|
Se non viene trovata alcuna proprietà di navigazione per la destinazione. |
odata_expands
Individuare tutte le $expand proprietà di navigazione da una tabella.
Restituisce le voci per ogni ricerca in uscita (proprietà di navigazione a valore singolo). Ogni voce contiene il nome esatto della proprietà di navigazione PascalCase necessaria per $expand e @odata.bind, oltre al nome del set di entità di destinazione.
Esempio:
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]]
Parametri
| Nome | Descrizione |
|---|---|
|
table
Necessario
|
Nome dello schema della tabella ,ad esempio |
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Elenco dict, ognuno con:
|
odata_select
Restituisce un elenco di nomi logici di colonna adatti per $select.
Può essere passato direttamente a client.records.get(table, select=...).
Esempio:
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]
Parametri
| Nome | Descrizione |
|---|---|
|
table
Necessario
|
Nome dello schema della tabella ,ad esempio |
|
include_system
Necessario
|
Includi colonne di sistema (impostazione predefinita |
Parametri di sole parole chiave
| Nome | Descrizione |
|---|---|
|
include_system
|
Valore predefinito: False
|
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Elenco di nomi logici di colonna minuscola. |
sql
Eseguire una query SQL di sola lettura usando l'API Web Dataverse.
L'endpoint SQL di Dataverse supporta un ampio subset di 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 * non è supportato: specificare i nomi di colonna in modo esplicito.
Usare sql_columns per individuare i nomi di colonna disponibili per una tabella.
Non supportato: SELECT >>*<<, sottoquery, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, funzioni finestra, funzioni stringa/data/matematica, INSERT/UPDATE/DELETE. Per le scritture, usare client.records i metodi.
sql(sql: str) -> List[Record]
Parametri
| Nome | Descrizione |
|---|---|
|
sql
Necessario
|
Istruzione SQL SELECT supportata. |
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Elenco di Record oggetti. Restituisce un elenco vuoto quando nessuna riga corrisponde. |
Eccezioni
| Tipo | Descrizione |
|---|---|
|
Se |
Esempio
Query di base:
rows = client.query.sql(
"SELECT TOP 10 name FROM account ORDER BY name"
)
JOIN con aggregazione:
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
Restituisce un elenco semplificato di colonne utilizzabili da SQL per una tabella.
Ogni dict contiene name (nome logico per SQL), type (tipo di attributo Dataverse), is_pk (flag di chiave primaria) e label (nome visualizzato). Le colonne virtuali vengono sempre escluse perché l'endpoint SQL non può eseguirne query.
Esempio:
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]]
Parametri
| Nome | Descrizione |
|---|---|
|
table
Necessario
|
Nome dello schema della tabella ,ad esempio |
|
include_system
Necessario
|
Quando |
Parametri di sole parole chiave
| Nome | Descrizione |
|---|---|
|
include_system
|
Valore predefinito: False
|
Valori restituiti
| Tipo | Descrizione |
|---|---|
|
Elenco dei set di dati dei metadati della colonna. |