Personalización de tablas y columnas

El SDK admite operaciones de creación, actualización y eliminación (CUD) para tablas y columnas personalizadas, asociación de soluciones opcionales, además de definiciones de tabla de recuperación y lista.

Echemos un vistazo al código de ejemplo para trabajar con una tabla personalizada.

# Create a custom table, including the customization prefix value in the schema names for the table and columns.
table_info = client.tables.create("new_Product", {
    "new_Code": "string",
    "new_Description": "memo",
    "new_Price": "decimal",
    "new_Active": "bool"
})

# Create with custom primary column name and solution assignment
table_info = client.tables.create(
    "new_Product",
    columns={
        "new_Code": "string",
        "new_Price": "decimal"
    },
    solution="MyPublisher",  # Optional: add to specific solution
    primary_column="new_ProductName",  # Optional: custom primary column (default is "{customization prefix value}_Name")
)

# Get table information
info = client.tables.get("new_Product")
print(f"Logical name: {info['table_logical_name']}")
print(f"Entity set: {info['entity_set_name']}")

# List all tables
tables = client.tables.list()
for table in tables:
    print(table)

# Add columns to existing table (columns must include customization prefix value)
client.tables.add_columns("new_Product", {"new_Category": "string"})

# Remove columns
client.tables.remove_columns("new_Product", ["new_Category"])

# List all columns (attributes) for a table to discover schema
columns = client.tables.list_columns("account")
for col in columns:
    print(f"{col['name']} ({col.get('AttributeType')})")

# List only specific properties
columns = client.tables.list_columns(
    "account",
    select=["LogicalName", "SchemaName", "AttributeType"],
    filter="AttributeType eq 'String'",
)

# Clean up
client.tables.delete("new_Product")

Tipos de columna compatibles

Las cadenas de tipo siguientes son aceptadas por create() y add_columns().

Type Alias aceptados
string text
memo multiline
int integer
decimal money
float double
bool boolean
datetime date
file

Para las columnas de conjunto de opciones (choice), pase directamente una subclase de IntEnum (o un Enum cuyos miembros tengan valores enteros) como valor del tipo de columna en lugar de una cadena. El SDK usa los miembros de clase para definir los valores del conjunto de opciones.

from enum import IntEnum

class Priority(IntEnum):
    LOW = 1
    MEDIUM = 2
    HIGH = 3

table_info = client.tables.create("new_Task", {
    "new_Title": "string",
    "new_Priority": Priority,   # optionset column
})

Objeto devuelto TableInfo

El método client.tables.create() devuelve un objeto TableInfo. Acceda directamente a sus propiedades o use la notación de clave dict heredada para la compatibilidad con versiones anteriores.

table_info = client.tables.create("new_Product", {"new_Code": "string"})

print(table_info.schema_name)       # new_Product
print(table_info.logical_name)      # new_product
print(table_info.entity_set_name)   # new_products
print(table_info.columns_created)   # ['new_Code', ...]

# Legacy dict-key access still works
print(table_info["table_schema_name"])

Los add_columns() métodos y remove_columns() devuelven la lista de nombres de esquema de columna que crean o quitan. El get() método devuelve metadatos de tabla o None si la tabla no existe, lo que hace que sea útil para las comprobaciones de existencia.

Claves alternativas

Una clave alternativa identifica un registro mediante una o varias columnas empresariales en lugar de un GUID generado por Dataverse. Se requieren claves alternativas para las operaciones upsert . Defínalos en el portal para creadores de Power Apps, en Tabla>, o mediante programación con client.tables.create_alternate_key.

# Create an alternate key on the accountnumber column
key = client.tables.create_alternate_key(
    "account",
    "account_accountnumber_ak",
    ["accountnumber"],
    display_name="Account Number",
)
print(f"Created key {key.schema_name} ({key.metadata_id}), status={key.status}")

# The key status transitions from Pending to Active asynchronously - poll before upserting
for k in client.tables.get_alternate_keys("account"):
    if k.schema_name == "account_accountnumber_ak":
        print(f"{k.schema_name}: {k.status}")

Important

La transición de Pending a Active no es inmediata. Compruebe el estado de la clave justo después de su creación y espere hasta que su estado sea Active antes de emitir solicitudes de inserción o actualización. Sin una clave alternativa activa, Dataverse rechaza las solicitudes upsert con un error 400.

Important

Todos los nombres de columna personalizados deben incluir el valor de prefijo de personalización (por ejemplo, "new_"). Este requisito garantiza la nomenclatura explícita y predecible y se alinea con los requisitos de metadatos de Dataverse.

Para obtener más información sobre cómo trabajar con metadatos de tabla personalizados:

  • create siempre devuelve una lista de GUID (length=1 para una sola entrada).
  • update y delete devuelven None para interfaces únicas y múltiples.
  • Pasar una lista de cargas para create desencadenar una creación masiva y devuelve una list[str] de identificadores.
  • get admite la recuperación de registros únicos con identificador de registro o paginación a través de conjuntos de resultados (prefiere seleccionar para limitar columnas).
  • Para los métodos CRUD que toman un identificador de registro pase la cadena GUID (36 caracteres con guiones). Los paréntesis alrededor del GUID se aceptan, pero no son necesarios.

Consulte también