本文介紹如何通過 Python SDK 對錶格儲存的資料進行批次更新操作,包括寫入資料、修改資料和刪除資料,支援同時操作多個表的資料。
注意事項
服務端檢查到部分操作的參數錯誤時會拋出參數錯誤異常,此時該請求中的所有操作都將不執行。
批次更新操作單次支援寫入的最大行數為200行,且所有行的資料量總和不能超過4MB。
批量寫入資料時,如果多次對同一個表調用add操作,僅最後一次add請求生效。
前提條件
方法說明
def batch_write_row(self, request)範例程式碼
以下範例程式碼使用批量資料操作方法在 test_table 表中插入一行資料。
try:
# 構造請求資料
request = BatchWriteRowRequest()
put_row_items = []
# 構造 PutRowItem
put_pk = [('id', 'row1')]
put_columns = []
put_row = Row(put_pk, put_columns)
# 寫入資料時必須指定寫入條件 (RowExistenceExpectation.IGNORE,表示不做行存在性判斷)
put_row_item = PutRowItem(put_row, Condition(RowExistenceExpectation.IGNORE))
put_row_items.append(put_row_item)
request.add(TableInBatchWriteRowItem('test_table', put_row_items))
# 調用 batch_write_row 方法進行批量資料操作
response = client.batch_write_row(request)
# 返回結果處理
# put row
for table_name,put_rows in response.table_of_put.items():
for item in put_rows:
if not item.is_ok:
print('TableName: %s. Failed put row, Error message: %s' % (table_name, item.error_message))
# update row
for table_name, update_rows in response.table_of_update.items():
for item in update_rows:
if not item.is_ok:
print('TableName: %s. Failed update row, Error message: %s.' % (table_name, item.error_message))
# delete row
for table_name, delete_rows in response.table_of_delete.items():
for item in delete_rows:
if not item.is_ok:
print('TableName: %s. Failed delete row, Error message: %s.' % (table_name, item.error_message))
except Exception as e:
print('Batch write row failed with error: %s' % e)不同類型的資料操作範例程式碼參考如下。
PutRowItem:寫入行資料。
put_row_items = [] # 構造 PutRowItem put_pk = [('id', 'row1')] put_columns = [] put_row = Row(put_pk, put_columns) # 寫入資料時必須指定寫入條件 (RowExistenceExpectation.IGNORE,表示不做行存在性判斷) put_row_item = PutRowItem(put_row, Condition(RowExistenceExpectation.IGNORE)) put_row_items.append(put_row_item) request.add(TableInBatchWriteRowItem('test_table', put_row_items))寫入行資料時添加屬性列。
# 屬性列 put_columns = [('col1','val1')] # 自訂資料版本號碼的屬性列 put_columns = [('col1','val1', int(time.time() * 1000))]UpdateRowItem:更新行資料,您可以修改屬性列的值、添加資料列、刪除屬性列的某個版本或整個屬性列。
update_row_items = [] # 構造 UpdateRowItem update_pk = [('id', 'row1')] update_columns = { 'PUT': [('col1', 'changed_val1')] } update_row = Row(update_pk, update_columns) # 更新資料時必須指定更新條件 (RowExistenceExpectation.IGNORE,表示不做行存在性判斷) update_row_item = UpdateRowItem(update_row, Condition(RowExistenceExpectation.IGNORE)) update_row_items.append(update_row_item) request.add(TableInBatchWriteRowItem('test_table', update_row_items))更新行資料時添加或刪除屬性列。
# 添加屬性列 update_columns = { 'PUT': [('col3', 'val3')] } # 添加自訂資料版本號碼的屬性列 update_columns = { 'PUT': [('col4', 'val4', int(time.time() * 1000))] } # 刪除屬性列 update_columns = { 'DELETE_ALL': ['col2'] }DeleteRowItem:刪除行資料。
delete_row_items = [] # 構造 DeleteRowItem delete_pk = [('id', 'row1')] delete_row = Row(delete_pk, []) # 寫入資料時必須指定寫入條件 (RowExistenceExpectation.IGNORE,表示不做行存在性判斷) delete_row_item = DeleteRowItem(delete_row, Condition(RowExistenceExpectation.IGNORE)) delete_row_items.append(delete_row_item) request.add(TableInBatchWriteRowItem('test_table', delete_row_items))對單表執行多次操作樣本
request = BatchWriteRowRequest() table_batch_items = TableInBatchWriteRowItem('<TABLE_NAME>', put_row_items) table_batch_items.row_items += delete_row_items request.add(table_batch_items)