Utilisez le SDK Tablestore pour Python afin d'ajouter des conditions aux opérations d'insertion (put), de mise à jour ou de suppression de lignes. L'opération ne s'exécute que si la ligne cible remplit les conditions spécifiées.
Prérequis
Installez le SDK Tablestore pour Python et initialisez un client.
Description de la fonctionnalité
Utilisez l'objet Condition pour spécifier une condition d'existence de ligne et une condition sur la valeur d'une colonne d'attribut. Transmettez cette condition à put_row, update_row, delete_row ou à l'opération par lot correspondante. Si la condition n'est pas remplie, le serveur renvoie une erreur et ne modifie pas la ligne.
Condition(row_existence_expectation, column_condition=None)
L'exemple suivant met à jour la colonne d'attribut status uniquement si la ligne cible 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,
)
Paramètres
Condition de mise à jour
L'objet Condition contient les paramètres suivants.
|
Nom |
Type |
Description |
|
row_existence_expectation (obligatoire) |
|
La condition d'existence de la ligne. La valeur |
|
column_condition (facultatif) |
|
La condition sur la valeur de la colonne d'attribut. Les types |
Condition de valeur sur une seule colonne
Appelez SingleColumnCondition(column_name, column_value, comparator, pass_if_missing=True, latest_version_only=True) pour créer une condition de valeur sur une seule colonne.
|
Nom |
Type |
Description |
|
column_name (obligatoire) |
|
Le nom de la colonne d'attribut à évaluer. |
|
column_value (obligatoire) |
|
La valeur cible. Son type doit correspondre au type de valeur de la colonne d'attribut. |
|
comparator (obligatoire) |
|
L'opérateur de comparaison. Les valeurs valides sont |
|
pass_if_missing (facultatif) |
|
Indique si la condition est considérée comme satisfaite lorsque la colonne d'attribut cible est absente. Valeur par défaut : |
|
latest_version_only (facultatif) |
|
Indique s'il faut évaluer uniquement la dernière version. Valeur par défaut : |
Condition d'expression régulière sur une seule colonne
Appelez SingleColumnRegexCondition(column_name, comparator, column_value=None, regex_rule=None, latest_version_only=True) pour créer une condition d'expression régulière sur une seule colonne. Seules les colonnes d'attribut de type chaîne prennent en charge les conditions d'expression régulière.
|
Nom |
Type |
Description |
|
column_name (obligatoire) |
|
Le nom de la colonne d'attribut de type chaîne à évaluer. |
|
comparator (obligatoire) |
|
L'opérateur de comparaison. Les valeurs valides sont |
|
column_value (facultatif) |
|
La valeur cible. Omettez ce paramètre si |
|
regex_rule (facultatif) |
|
La règle d'extraction de sous-chaîne et de conversion de type. Si ce paramètre est omis, la valeur de la colonne d'attribut est comparée directement. |
|
latest_version_only (facultatif) |
|
Indique s'il faut évaluer uniquement la dernière version. Valeur par défaut : |
Si la colonne d'attribut cible est manquante, une condition d'expression régulière sur une seule colonne n'est jamais satisfaite. Le paramètre pass_if_missing ne peut pas être configuré séparément pour cette condition.
Règle d'expression régulière
Le paramètre regex_rule est de type RegexRule et contient les paramètres suivants.
|
Nom |
Type |
Description |
|
regex_input (obligatoire) |
|
L'expression régulière, limitée à 256 octets. Les expressions compatibles Perl et les caractères mono-octet sont pris en charge. Les caractères chinois ne sont pas pris en charge. Si l'expression contient des groupes de capture, le premier groupe est extrait. Sinon, la correspondance entière est extraite. |
|
cast_type (obligatoire) |
|
Le type vers lequel la valeur extraite est convertie. Les valeurs valides sont |
Condition de valeur composite
Appelez CompositeColumnCondition(combinator) pour créer une condition de valeur composite, puis appelez add_sub_condition pour ajouter des conditions.
|
Nom |
Type |
Description |
|
combinator (obligatoire) |
|
L'opérateur logique. Les valeurs valides sont |
|
sub_conditions (obligatoire) |
|
Les conditions à combiner. Les conditions de valeur sur une seule colonne, les conditions d'expression régulière sur une seule colonne et les conditions composites imbriquées sont prises en charge, avec un maximum de 32 conditions. |
Exemples
Utiliser une condition de valeur sur une seule colonne
L'exemple suivant met à jour les données uniquement si la ligne cible existe et si la dernière valeur de la colonne d'attribut status est pending. La condition n'est pas satisfaite si la colonne est manquante.
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)
Combiner des conditions de valeur sur les colonnes
L'exemple suivant construit la condition (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)
Implémenter le verrouillage optimiste avec CAS
L'exemple suivant lit la valeur actuelle de revision et l'utilise comme condition de mise à jour. La révision n'est incrémentée que si aucune autre requête n'a modifié les données.
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)