DataverseClient Classe
Cliente de alto nível para operações do Microsoft Dataverse.
Esse cliente fornece uma interface simples e estável para interagir com ambientes do Dataverse por meio da API Web. Ele manipula a autenticação por meio da Identidade do Azure e delega operações HTTP a um PowerPlatform.Dataverse.data._odata._ODataClient interno.
Principais capacidades:
Operações OData CRUD: criar, ler, atualizar, excluir registros
Consultas SQL: executar SQL somente leitura por meio do parâmetro da API
?sqlWebMetadados de tabela: criar, inspecionar e excluir tabelas personalizadas; criar e excluir colunas
Uploads de arquivo: carregar arquivos em colunas de arquivo com suporte de agrupamento
Observação
O cliente inicializa lentamente seu cliente OData interno no primeiro uso, permitindo a construção leve sem chamadas de rede imediatas.
Observação
Todos os métodos que se comunicam com a API Web do Dataverse podem gerar
HttpError em não-bem-sucedido
Respostas HTTP (por exemplo, 401, 403, 404, 429, 500). Método individual
Docstrings documenta apenas exceções específicas do domínio.
As operações são organizadas em namespaces:
client.records– criar, atualizar, excluir e obter registros (consultas simples ou paginadas)client.query– operações de consulta e pesquisaclient.tables– gerenciamento de metadados de tabela e colunaclient.files– operações de upload de arquivo
Construtor
DataverseClient(base_url: str, credential: TokenCredential, config: DataverseConfig | None = None)
Parâmetros
| Nome | Description |
|---|---|
|
base_url
Obrigatório
|
Sua URL de ambiente do Dataverse, por exemplo |
|
credential
Obrigatório
|
Credencial de Identidade do Azure para autenticação. |
|
config
|
Configuração opcional para idioma, tempos limite e novas tentativas. Se não for fornecido, os padrões serão carregados de from_env. Valor padrão: None
|
Exemplos
Crie um cliente e execute operações básicas:
from azure.identity import InteractiveBrowserCredential
from PowerPlatform.Dataverse.client import DataverseClient
credential = InteractiveBrowserCredential()
client = DataverseClient(
"https://org.crm.dynamics.com",
credential
)
# Create a record
record_id = client.records.create("account", {"name": "Contoso Ltd"})
# Update a record
client.records.update("account", record_id, {"telephone1": "555-0100"})
# Query records
for page in client.records.get("account", filter="name eq 'Contoso Ltd'"):
for account in page:
print(account["name"])
# Delete a record
client.records.delete("account", record_id)
Métodos
| create |
Observação Preterido. Use create em seu lugar. Crie um ou mais registros pelo nome da tabela. |
| create_columns |
Observação Preterido. Use add_columns em seu lugar. Crie uma ou mais colunas em uma tabela existente usando um mapeamento de estilo de esquema. |
| create_table |
Observação Preterido. Use create em seu lugar. Crie uma tabela personalizada simples com colunas especificadas. |
| delete |
Observação Preterido. Use delete em seu lugar. Exclua um ou mais registros por GUID. |
| delete_columns |
Observação Preterido. Use remove_columns em seu lugar. Exclua uma ou mais colunas de uma tabela. |
| delete_table |
Observação Preterido. Use delete em seu lugar. Exclua uma tabela personalizada por nome. Aviso Essa operação é irreversível e excluirá todos os registros na tabela junto com a definição da tabela. Utilize com cuidado. |
| flush_cache |
Liberar metadados de cliente armazenados em cache ou estado. |
| get |
Observação Preterido. Use get em seu lugar. Registro único por ID – client.records.get(table, record_id) Consultar/filtrar vários registros – client.records.get(table, filter=..., select=...) Buscar um único registro por ID ou consultar vários registros. Quando |
| get_table_info |
Observação Preterido. Use get em seu lugar. Obtenha metadados básicos para uma tabela se ela existir. |
| list_tables |
Observação Preterido. Use list em seu lugar. Liste todas as tabelas não privadas no ambiente do Dataverse. |
| query_sql |
Observação Preterido. Use sql em seu lugar. Execute uma consulta SQL somente leitura usando a funcionalidade da API A consulta SQL deve seguir o subconjunto com suporte: uma única instrução SELECT com WHERE opcional, TOP (literal inteiro), ORDER BY (somente nomes de coluna) e um alias de tabela simples após FROM. Observação O suporte ao SQL é limitado a consultas somente leitura. Não há suporte para junções complexas, subconsultas e determinadas funções SQL. Consulte a documentação do Dataverse para o conjunto de recursos atual. |
| update |
Observação Preterido. Use update em seu lugar. Atualize um ou mais registros. Esse método dá suporte a três padrões de uso:
Observação As atualizações simples descartam a representação de resposta para melhorar o desempenho. Para atualizações de difusão ou emparelhadas, o método delega à lógica de atualização em lote do cliente interno. |
| upload_file |
Observação Preterido. Use upload em seu lugar. Carregue um arquivo em uma coluna de arquivo do Dataverse. |
create
Observação
Preterido. Use create em seu lugar.
Crie um ou mais registros pelo nome da tabela.
create(table_schema_name: str, records: Dict[str, Any] | List[Dict[str, Any]]) -> List[str]
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo |
|
records
Obrigatório
|
Um dicionário de registro único ou uma lista de dicionários de registros. Cada dicionário deve conter nomes de esquema de coluna como chaves. |
Retornos
| Tipo | Description |
|---|---|
|
Lista de GUIDs de registro criados. Retorna uma lista de elementos únicos para uma única entrada. |
Exceções
| Tipo | Description |
|---|---|
|
Se |
Exemplos
Crie um único registro:
client = DataverseClient(base_url, credential)
ids = client.create("account", {"name": "Contoso"})
print(f"Created: {ids[0]}")
Crie vários registros:
records = [
{"name": "Contoso"},
{"name": "Fabrikam"}
]
ids = client.create("account", records)
print(f"Created {len(ids)} accounts")
create_columns
Observação
Preterido. Use add_columns em seu lugar.
Crie uma ou mais colunas em uma tabela existente usando um mapeamento de estilo de esquema.
create_columns(table_schema_name: str, columns: Dict[str, Any]) -> List[str]
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo |
|
columns
Obrigatório
|
Mapeamento de nomes de esquema de coluna (com valor de prefixo de personalização) para tipos com suporte. Todos os nomes de coluna personalizados devem incluir o valor do prefixo de personalização** (por exemplo). |
Retornos
| Tipo | Description |
|---|---|
|
Nomes de esquema para as colunas que foram criadas. |
Exemplos
Crie várias colunas na tabela personalizada:
created = client.create_columns(
"new_MyTestTable",
{
"new_Scratch": "string",
"new_Flags": "bool",
"new_Document": "file",
},
)
print(created) # ['new_Scratch', 'new_Flags', 'new_Document']
create_table
Observação
Preterido. Use create em seu lugar.
Crie uma tabela personalizada simples com colunas especificadas.
create_table(table_schema_name: str, columns: Dict[str, Any], solution_unique_name: str | None = None, primary_column_schema_name: str | None = None) -> Dict[str, Any]
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela com valor de prefixo de personalização (por exemplo |
|
columns
Obrigatório
|
Nomes de coluna de mapeamento de dicionário (com valor de prefixo de personalização) para seus tipos. Todos os nomes de coluna personalizados devem incluir o valor do prefixo de personalização (por exemplo).
|
|
solution_unique_name
|
Nome exclusivo da solução opcional que deve ser o proprietário da nova tabela. Quando a tabela é omitida é criada na solução padrão. Valor padrão: None
|
|
primary_column_schema_name
|
Nome do esquema de coluna de nome primário opcional com valor de prefixo de personalização (por exemplo). Valor padrão: None
|
Retornos
| Tipo | Description |
|---|---|
|
Dicionário que contém metadados de tabela, incluindo , , , e |
Exceções
| Tipo | Description |
|---|---|
|
Se a criação da tabela falhar ou o esquema for inválido. |
Exemplos
Crie uma tabela com colunas simples:
from enum import IntEnum
class ItemStatus(IntEnum):
ACTIVE = 1
INACTIVE = 2
columns = {
"new_Title": "string", # Note: includes 'new_' customization prefix value
"new_Quantity": "int",
"new_Price": "decimal",
"new_Available": "bool",
"new_Status": ItemStatus
}
result = client.create_table("new_MyTestTable", columns)
print(f"Created table: {result['table_schema_name']}")
print(f"Columns: {result['columns_created']}")
Crie uma tabela com um nome de coluna primária personalizado:
result = client.create_table(
"new_Product",
{"new_Price": "decimal"},
primary_column_schema_name="new_ProductName"
)
delete
Observação
Preterido. Use delete em seu lugar.
Exclua um ou mais registros por GUID.
delete(table_schema_name: str, ids: str | List[str], use_bulk_delete: bool = True) -> str | None
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo, |
|
ids
Obrigatório
|
Cadeia de caracteres GUID única ou lista de cadeias de caracteres GUID a serem excluídas. |
|
use_bulk_delete
|
Quando Valor padrão: True
|
Retornos
| Tipo | Description |
|---|---|
|
str,
|
ID do trabalho BulkDelete ao excluir vários registros via BulkDelete; caso contrário |
Exceções
| Tipo | Description |
|---|---|
|
Se |
|
|
Se a solicitação de exclusão da API Web subjacente falhar. |
Exemplos
Excluir um único registro:
client.delete("account", account_id)
Excluir vários registros:
job_id = client.delete("account", [id1, id2, id3])
delete_columns
Observação
Preterido. Use remove_columns em seu lugar.
Exclua uma ou mais colunas de uma tabela.
delete_columns(table_schema_name: str, columns: str | List[str]) -> List[str]
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo |
|
columns
Obrigatório
|
Nome da coluna ou lista de nomes de coluna a serem removidos. Deve incluir o valor do prefixo de personalização (por exemplo |
Retornos
| Tipo | Description |
|---|---|
|
Nomes de esquema para as colunas que foram removidas. |
Exemplos
Remova duas colunas personalizadas pelo nome do esquema:
removed = client.delete_columns( "new_MyTestTable", ["new_Scratch", "new_Flags"],
) print(removed) # ['new_Scratch', 'new_Flags']
delete_table
Observação
Preterido. Use delete em seu lugar.
Exclua uma tabela personalizada por nome.
Aviso
Essa operação é irreversível e excluirá todos os registros na tabela junto
com a definição da tabela. Utilize com cuidado.
delete_table(table_schema_name: str) -> None
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo, |
Exceções
| Tipo | Description |
|---|---|
|
Se a tabela não existir ou a exclusão falhar. |
Exemplos
Excluir uma tabela personalizada:
client.delete_table("new_MyTestTable")
flush_cache
Liberar metadados de cliente armazenados em cache ou estado.
flush_cache(kind) -> int
Parâmetros
| Nome | Description |
|---|---|
|
kind
Obrigatório
|
Tipo de cache a ser liberado. Valores com suporte no momento:
Tipos futuros (por exemplo |
Retornos
| Tipo | Description |
|---|---|
|
Número de entradas de cache removidas. |
Exemplos
Desmarque o cache da lista de seleção:
removed = client.flush_cache("picklist")
print(f"Cleared {removed} cached picklist entries")
get
Observação
Preterido. Use get em seu lugar.
Registro único por ID – client.records.get(table, record_id)
Consultar/filtrar vários registros – client.records.get(table, filter=..., select=...)
Buscar um único registro por ID ou consultar vários registros.
Quando record_id for fornecido, retornará um único dicionário de registros.
Quando record_id é None, retorna um gerador que produz lotes de registros.
get(table_schema_name: str, record_id: str | None = None, select: List[str] | None = None, filter: str | None = None, orderby: List[str] | None = None, top: int | None = None, expand: List[str] | None = None, page_size: int | None = None) -> Dict[str, Any] | Iterable[List[Dict[str, Any]]]
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo, |
|
record_id
|
GUID opcional para buscar um registro específico. Se Nenhum, consulta vários registros. Valor padrão: None
|
|
select
|
Lista opcional de nomes lógicos de atributo a serem recuperados. Os nomes de coluna não diferenciam maiúsculas de minúsculas e são automaticamente reduzidos (por exemplo, Valor padrão: None
|
|
filter
|
Cadeia de caracteres de filtro OData opcional, por exemplo Valor padrão: None
|
|
orderby
|
Lista opcional de atributos a serem classificados por, por exemplo. Valor padrão: None
|
|
top
|
Número máximo opcional de registros a serem retornados. Valor padrão: None
|
|
expand
|
Lista opcional de propriedades de navegação a serem expandidas, por exemplo. Valor padrão: None
|
|
page_size
|
Número opcional de registros por página para paginação. Valor padrão: None
|
Retornos
| Tipo | Description |
|---|---|
|
dict,
|
Se for fornecido um único ditado |
Exceções
| Tipo | Description |
|---|---|
|
Se |
Exemplos
Buscar um único registro:
record = client.get("account", record_id=account_id, select=["name", "telephone1"])
print(record["name"])
Consultar vários registros com filtragem (observação: nomes lógicos exatos no filtro):
for batch in client.get(
"account",
filter="statecode eq 0 and name eq 'Contoso'", # Must use exact logical names (lower-case)
select=["name", "telephone1"]
):
for account in batch:
print(account["name"])
Consulta com expansão da propriedade de navegação (observação: nome da propriedade que diferencia maiúsculas de minúsculas):
for batch in client.get(
"account",
select=["name"],
expand=["primarycontactid"], # Case-sensitive! Check metadata for exact name
filter="statecode eq 0"
):
for account in batch:
print(f"{account['name']} - Contact: {account.get('primarycontactid', {}).get('fullname')}")
Consulta com classificação e paginação:
for batch in client.get(
"account",
orderby=["createdon desc"],
top=100,
page_size=50
):
print(f"Batch size: {len(batch)}")
get_table_info
Observação
Preterido. Use get em seu lugar.
Obtenha metadados básicos para uma tabela se ela existir.
get_table_info(table_schema_name: str) -> Dict[str, Any] | None
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo, |
Retornos
| Tipo | Description |
|---|---|
|
dict,
|
Dicionário que contém metadados de tabela com chaves |
Exemplos
Recuperar metadados de tabela:
info = client.get_table_info("new_MyTestTable")
if info:
print(f"Logical name: {info['table_logical_name']}")
print(f"Entity set: {info['entity_set_name']}")
list_tables
Observação
Preterido. Use list em seu lugar.
Liste todas as tabelas não privadas no ambiente do Dataverse.
list_tables() -> list[dict[str, Any]]
Retornos
| Tipo | Description |
|---|---|
|
Lista de dicionários de metadados EntityDefinition. |
Exemplos
Liste todas as tabelas não privadas e imprima seus nomes lógicos:
tables = client.list_tables()
for table in tables:
print(table["LogicalName"])
query_sql
Observação
Preterido. Use sql em seu lugar.
Execute uma consulta SQL somente leitura usando a funcionalidade da API ?sql Web do Dataverse.
A consulta SQL deve seguir o subconjunto com suporte: uma única instrução SELECT com WHERE opcional, TOP (literal inteiro), ORDER BY (somente nomes de coluna) e um alias de tabela simples após FROM.
Observação
O suporte ao SQL é limitado a consultas somente leitura. Não há suporte para junções complexas, subconsultas e determinadas funções SQL. Consulte a documentação do Dataverse para o conjunto de recursos atual.
query_sql(sql: str) -> List[Dict[str, Any]]
Parâmetros
| Nome | Description |
|---|---|
|
sql
Obrigatório
|
Instrução SQL SELECT com suporte. |
Retornos
| Tipo | Description |
|---|---|
|
Lista de dicionários de linha de resultados. Retorna uma lista vazia se nenhuma linha corresponder. |
Exceções
| Tipo | Description |
|---|---|
|
Se a consulta SQL usar uma sintaxe sem suporte. |
|
|
Se a API Web retornar um erro. |
Exemplos
Consulta SQL básica:
sql = "SELECT TOP 10 accountid, name FROM account WHERE name LIKE 'C%' ORDER BY name"
results = client.query_sql(sql)
for row in results:
print(row["name"])
Consulta com alias:
sql = "SELECT a.name, a.telephone1 FROM account AS a WHERE a.statecode = 0"
results = client.query_sql(sql)
update
Observação
Preterido. Use update em seu lugar.
Atualize um ou mais registros.
Esse método dá suporte a três padrões de uso:
Atualização de registro único:
update("account", "guid", {"name": "New Name"})Atualização de difusão:
update("account", [id1, id2], {"status": 1})– aplica as mesmas alterações a todas as IDsAtualizações emparelhadas:
update("account", [id1, id2], [changes1, changes2])– mapeamento um para um
Observação
As atualizações simples descartam a representação de resposta para melhorar o desempenho. Para atualizações de difusão ou emparelhadas, o método delega à lógica de atualização em lote do cliente interno.
update(table_schema_name: str, ids: str | List[str], changes: Dict[str, Any] | List[Dict[str, Any]]) -> None
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela (por exemplo, |
|
ids
Obrigatório
|
Cadeia de caracteres GUID única ou lista de cadeias de caracteres GUID a serem atualizadas. |
|
changes
Obrigatório
|
Dicionário de alterações para modo de transmissão/único ou lista de dicionários para modo emparelhado. Quando |
Exceções
| Tipo | Description |
|---|---|
|
Se |
Exemplos
Atualização de registro único:
client.update("account", account_id, {"telephone1": "555-0100"})
Difunda as mesmas alterações para vários registros:
client.update("account", [id1, id2, id3], {"statecode": 1})
Atualize vários registros com valores diferentes:
ids = [id1, id2]
changes = [
{"name": "Updated Name 1"},
{"name": "Updated Name 2"}
]
client.update("account", ids, changes)
upload_file
Observação
Preterido. Use upload em seu lugar.
Carregue um arquivo em uma coluna de arquivo do Dataverse.
upload_file(table_schema_name: str, record_id: str, file_name_attribute: str, path: str, mode: str | None = None, mime_type: str | None = None, if_none_match: bool = True) -> None
Parâmetros
| Nome | Description |
|---|---|
|
table_schema_name
Obrigatório
|
Nome do esquema da tabela. |
|
record_id
Obrigatório
|
GUID do registro de destino. |
|
file_name_attribute
Obrigatório
|
Nome do esquema do atributo de coluna de arquivo. |
|
path
Obrigatório
|
Caminho do sistema de arquivos local para o arquivo. |
|
mode
|
Estratégia de upload: Valor padrão: None
|
|
mime_type
|
Tipo MIME explícito a ser armazenado com o arquivo. Valor padrão: None
|
|
if_none_match
|
Quando True (padrão), só terá êxito se a coluna estiver vazia no momento. Valor padrão: True
|