Gunakan Tablestore SDK untuk Python untuk menambahkan kondisi pada operasi put, update, atau delete baris sehingga operasi tersebut hanya dijalankan jika baris target memenuhi kondisi yang ditentukan.
Prasyarat
Instal Tablestore SDK untuk Python dan inisialisasi klien.
Deskripsi fungsi
Gunakan Condition untuk menentukan kondisi keberadaan baris dan kondisi nilai kolom atribut. Teruskan kondisi tersebut ke put_row, update_row, delete_row, atau operasi batch baris yang sesuai. Jika kondisi tidak terpenuhi, server akan mengembalikan error dan tidak mengubah baris tersebut.
Condition(row_existence_expectation, column_condition=None)
Contoh berikut memperbarui kolom atribut status hanya jika baris target ada.
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,
)
Parameter
Kondisi pembaruan
Condition mencakup parameter berikut.
|
Name |
Type |
Description |
|
row_existence_expectation (required) |
|
Kondisi keberadaan baris. |
|
column_condition (optional) |
|
Kondisi nilai kolom atribut. Didukung |
Kondisi nilai kolom tunggal
Panggil SingleColumnCondition(column_name, column_value, comparator, pass_if_missing=True, latest_version_only=True) untuk membuat kondisi nilai kolom tunggal.
|
Name |
Type |
Description |
|
column_name (required) |
|
Nama kolom atribut yang akan dievaluasi. |
|
column_value (required) |
|
Nilai target. Jenisnya harus sesuai dengan jenis nilai kolom atribut. |
|
comparator (required) |
|
Operator perbandingan. Nilai yang valid adalah |
|
pass_if_missing (optional) |
|
Menentukan apakah kondisi terpenuhi jika kolom atribut target tidak ada. Nilai default: |
|
latest_version_only (optional) |
|
Menentukan apakah hanya versi terbaru yang dievaluasi. Nilai default: |
Kondisi ekspresi reguler kolom tunggal
Panggil SingleColumnRegexCondition(column_name, comparator, column_value=None, regex_rule=None, latest_version_only=True) untuk membuat kondisi ekspresi reguler kolom tunggal. Hanya kolom atribut bertipe string yang mendukung kondisi ekspresi reguler.
|
Name |
Type |
Description |
|
column_name (required) |
|
Nama kolom atribut string yang akan dievaluasi. |
|
comparator (required) |
|
Operator perbandingan. Nilai yang valid adalah |
|
column_value (optional) |
|
Nilai target. Abaikan parameter ini jika |
|
regex_rule (optional) |
|
Aturan ekstraksi substring dan konversi tipe. Jika parameter ini diabaikan, nilai kolom atribut dibandingkan secara langsung. |
|
latest_version_only (optional) |
|
Menentukan apakah hanya versi terbaru yang dievaluasi. Nilai default: |
Jika kolom atribut target tidak ada, kondisi ekspresi reguler kolom tunggal tidak pernah terpenuhi. Parameter pass_if_missing tidak dapat dikonfigurasi secara terpisah untuk kondisi ini.
Aturan ekspresi reguler
Parameter regex_rule bertipe RegexRule dan mencakup parameter berikut.
|
Name |
Type |
Description |
|
regex_input (required) |
|
Ekspresi reguler, maksimal 256 byte. Ekspresi yang kompatibel dengan Perl dan karakter single-byte didukung. Karakter Tionghoa tidak didukung. Jika ekspresi berisi capturing groups, grup pertama diekstraksi. Jika tidak, seluruh kecocokan diekstraksi. |
|
cast_type (required) |
|
Jenis tujuan konversi nilai yang diekstraksi. Nilai yang valid adalah |
Kondisi nilai kolom majemuk
Panggil CompositeColumnCondition(combinator) untuk membuat kondisi nilai kolom majemuk, lalu gunakan add_sub_condition untuk menambahkan subkondisi.
|
Name |
Type |
Description |
|
combinator (required) |
|
Operator logika. Nilai yang valid adalah |
|
sub_conditions (required) |
|
Kondisi yang akan digabungkan. Didukung kondisi nilai kolom tunggal, kondisi ekspresi reguler kolom tunggal, dan kondisi majemuk bersarang, dengan maksimal 32 kondisi. |
Contoh
Gunakan kondisi nilai kolom tunggal
Contoh berikut memperbarui data hanya jika baris target ada dan nilai terbaru dari kolom atribut status adalah pending. Kondisi tidak terpenuhi jika kolom tersebut tidak ada.
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)
Gabungkan kondisi nilai kolom
Contoh berikut membangun kondisi (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)
Implementasikan kunci optimis dengan CAS
Contoh berikut membaca nilai revision saat ini dan menggunakannya sebagai kondisi pembaruan. Revisi hanya dinaikkan jika permintaan lain belum memodifikasi data tersebut.
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)