Utilice Tablestore SDK for Python para agregar condiciones a las operaciones de inserción, actualización o eliminación de filas. De este modo, la operación se ejecuta únicamente si la fila destino cumple con dichas condiciones.
Requisitos previos
Instale Tablestore SDK for Python e inicialice un cliente.
Descripción de la función
Utilice Condition para especificar una condición de existencia de fila y una condición de valor de columna de atributo. Pase la condición a put_row, update_row, delete_row o a la operación por lotes de filas correspondiente. Si no se cumple la condición, el servidor devuelve un error y no modifica la fila.
Condition(row_existence_expectation, column_condition=None)
En el siguiente ejemplo se actualiza la columna de atributo status solo si la fila destino existe.
primary_key = [("partition", "device"), ("id", 1)]
row = Row(primary_key, {"PUT": [("status", "online")]})
condition = Condition(RowExistenceExpectation.EXPECT_EXIST)
consumed, return_row = client.update_row(
"example_table",
row,
condition,
)
Parámetros
Condición de actualización
Condition contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
row_existence_expectation (obligatorio) |
|
La condición de existencia de la fila. |
|
column_condition (opcional) |
|
La condición de valor de la columna de atributo. Se admiten |
Condición de valor de columna única
Llame a SingleColumnCondition(column_name, column_value, comparator, pass_if_missing=True, latest_version_only=True) para crear una condición de valor de columna única.
|
Nombre |
Tipo |
Descripción |
|
column_name (obligatorio) |
|
El nombre de la columna de atributo que se va a evaluar. |
|
column_value (obligatorio) |
|
El valor destino. Su tipo debe coincidir con el tipo de valor de la columna de atributo. |
|
comparator (obligatorio) |
|
El operador de comparación. Los valores válidos son |
|
pass_if_missing (opcional) |
|
Especifica si la condición se cumple cuando falta la columna de atributo destino. Valor predeterminado: |
|
latest_version_only (opcional) |
|
Especifica si se evalúa únicamente la versión más reciente. Valor predeterminado: |
Condición de expresión regular de columna única
Llame a SingleColumnRegexCondition(column_name, comparator, column_value=None, regex_rule=None, latest_version_only=True) para crear una condición de expresión regular de columna única. Solo las columnas de atributo de tipo cadena admiten condiciones de expresión regular.
|
Nombre |
Tipo |
Descripción |
|
column_name (obligatorio) |
|
El nombre de la columna de atributo de tipo cadena que se va a evaluar. |
|
comparator (obligatorio) |
|
El operador de comparación. Los valores válidos son |
|
column_value (opcional) |
|
El valor destino. Omita este parámetro si |
|
regex_rule (opcional) |
|
La regla de extracción de subcadenas y conversión de tipos. Si se omite este parámetro, el valor de la columna de atributo se compara directamente. |
|
latest_version_only (opcional) |
|
Especifica si se evalúa únicamente la versión más reciente. Valor predeterminado: |
Si falta la columna de atributo destino, una condición de expresión regular de columna única nunca se cumple. No es posible configurar pass_if_missing por separado para esta condición.
Regla de expresión regular
El parámetro regex_rule es del tipo RegexRule y contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
regex_input (obligatorio) |
|
La expresión regular, de hasta 256 bytes. Se admiten expresiones compatibles con Perl y caracteres de un solo byte. No se admiten caracteres chinos. Si la expresión contiene grupos de captura, se extrae el primer grupo. De lo contrario, se extrae toda la coincidencia. |
|
cast_type (obligatorio) |
|
El tipo al que se convierte el valor extraído. Los valores válidos son |
Condición de valor de columna compuesta
Llame a CompositeColumnCondition(combinator) para crear una condición de valor de columna compuesta y, a continuación, llame a add_sub_condition para agregar condiciones.
|
Nombre |
Tipo |
Descripción |
|
combinator (obligatorio) |
|
El operador lógico. Los valores válidos son |
|
sub_conditions (obligatorio) |
|
Las condiciones que se van a combinar. Se admiten condiciones de valor de columna única, condiciones de expresión regular de columna única y condiciones compuestas anidadas, con un máximo de 32 condiciones. |
Ejemplos
Uso de una condición de valor de columna única
En el siguiente ejemplo se actualizan los datos solo si la fila destino existe y el valor más reciente de la columna de atributo status es pending. La condición no se cumple si falta la columna.
column_condition = SingleColumnCondition(
"status",
"pending",
ComparatorType.EQUAL,
pass_if_missing=False,
)
condition = Condition(
RowExistenceExpectation.EXPECT_EXIST,
column_condition,
)
client.update_row("example_table", row, condition)
Combinación de condiciones de valor de columna
En el siguiente ejemplo se construye la condición (status == "pending" AND revision == 1) OR priority > 5.
status_and_revision = CompositeColumnCondition(LogicalOperator.AND)
status_and_revision.add_sub_condition(
SingleColumnCondition("status", "pending", ComparatorType.EQUAL)
)
status_and_revision.add_sub_condition(
SingleColumnCondition("revision", 1, ComparatorType.EQUAL)
)
column_condition = CompositeColumnCondition(LogicalOperator.OR)
column_condition.add_sub_condition(status_and_revision)
column_condition.add_sub_condition(
SingleColumnCondition("priority", 5, ComparatorType.GREATER_THAN)
)
condition = Condition(RowExistenceExpectation.EXPECT_EXIST, column_condition)
Implementación de bloqueo optimista con CAS
En el siguiente ejemplo se lee el valor actual de revision y se utiliza como condición de actualización. La revisión se incrementa solo si otra solicitud no ha modificado los datos.
primary_key = [("partition", "device"), ("id", 1)]
consumed, current_row, next_token = client.get_row(
"example_table",
primary_key,
columns_to_get=["revision"],
)
old_revision = current_row.attribute_columns[0][1]
row = Row(primary_key, {"PUT": [("revision", old_revision + 1)]})
column_condition = SingleColumnCondition(
"revision",
old_revision,
ComparatorType.EQUAL,
pass_if_missing=False,
latest_version_only=True,
)
condition = Condition(RowExistenceExpectation.EXPECT_EXIST, column_condition)
client.update_row("example_table", row, condition)