Tablestore memungkinkan Anda menulis data ke tabel dengan menambahkan satu atau beberapa baris sekaligus. Anda dapat memilih untuk menulis baris secara individual atau dalam batch, sesuai kebutuhan bisnis Anda. Topik ini menjelaskan cara menulis data ke Tablestore menggunakan Tablestore SDK untuk Java.
Mode Penulisan
Tablestore menyediakan operasi PutRow, UpdateRow, dan BatchWriteRow untuk menulis data. Pilih operasi yang sesuai dengan kasus penggunaan Anda.
Mode Penulisan | Deskripsi | Skenario |
Panggil operasi PutRow untuk menyisipkan baris baru. Jika baris tersebut sudah ada, Tablestore menghapus semua versi data di semua kolom dari baris yang ada sebelum menyisipkan baris baru. | Operasi ini cocok untuk skenario di mana Anda perlu menulis jumlah data yang kecil. | |
Panggil operasi UpdateRow untuk memperbarui baris. Anda dapat menambahkan atau menghapus kolom atribut, menghapus versi tertentu dari data dalam kolom atribut, atau memperbarui nilai kolom atribut yang ada. Jika baris tidak ada, baris baru akan disisipkan. | Operasi ini cocok untuk skenario di mana Anda ingin memperbarui data yang sudah ada. Misalnya, Anda dapat menghapus kolom atribut, menghapus versi tertentu dari data, atau memperbarui nilai kolom atribut. | |
Panggil operasi BatchWriteRow untuk menulis beberapa baris atau menulis ke beberapa tabel dalam satu permintaan. Operasi BatchWriteRow terdiri dari beberapa suboperasi PutRow, UpdateRow, dan DeleteRow. Setiap suboperasi dibuat dengan cara yang sama seperti operasi PutRow, UpdateRow, atau DeleteRow individual. | Operasi ini cocok untuk skenario di mana Anda ingin menulis, menghapus, atau memperbarui jumlah data yang besar atau melakukan operasi tulis, hapus, dan perbarui secara bersamaan. |
Prasyarat
Anda telah menginisialisasi client.
Anda telah membuat tabel dan menulis data ke dalamnya.
Sisipkan satu baris data
Panggil operasi PutRow untuk menyisipkan baris baru. Jika baris tersebut sudah ada, Tablestore akan menghapus semua versi data di semua kolom dari baris yang ada sebelum menyisipkan baris baru.
API
"""
Deskripsi: Operasi ini menulis satu baris data. Jumlah unit kapasitas (CUs) yang dikonsumsi oleh operasi ini dikembalikan.
table_name: nama tabel.
row: baris yang akan ditulis, termasuk kolom kunci primer dan kolom atribut.
condition: kondisi yang harus dipenuhi untuk menjalankan operasi. Tablestore memeriksa apakah kondisi terpenuhi sebelum menjalankan operasi. Operasi hanya dijalankan jika kondisi terpenuhi. Parameter condition adalah instance dari kelas tablestore.metadata.Condition.
Dua jenis kondisi didukung: kondisi keberadaan baris dan kondisi nilai kolom. Untuk kondisi keberadaan baris, atur parameter condition ke IGNORE, EXPECT_EXIST, atau EXPECT_NOT_EXIST.
return_type: jenis data yang dikembalikan. Parameter return_type adalah instance dari kelas tablestore.metadata.ReturnType. Hanya kunci primer yang dapat dikembalikan. Dalam kebanyakan kasus, parameter ini digunakan untuk kolom kunci primer auto-increment.
Respons: jumlah CUs yang dikonsumsi oleh operasi dan data baris yang dikembalikan.
consumed: jumlah CUs yang dikonsumsi oleh operasi. Parameter consumed adalah instance dari kelas tablestore.metadata.CapacityUnit.
return_row: data baris yang dikembalikan, yang mungkin mencakup kolom kunci primer dan kolom atribut.
Contoh:
primary_key = [('gid',1), ('uid',101)]
attribute_columns = [('name','Mary'), ('mobile',111111111), ('address','City A in China'), ('age',20)]
row = Row(primary_key, attribute_columns)
condition = Condition('EXPECT_NOT_EXIST')
consumed, return_row = client.put_row('myTable', row, condition)
"""
def put_row(self, table_name, row, condition = None, return_type = None, transaction_id = None):Parameter
Parameter | Deskripsi |
table_name | Nama tabel data. |
row | Baris data. Parameter ini mencakup item konfigurasi berikut:
|
condition | Gunakan pembaruan bersyarat untuk menentukan kondisi keberadaan baris atau kondisi nilai kolom. Untuk informasi lebih lanjut, lihat Konfigurasikan pembaruan bersyarat. Catatan
|
return_type | Jenis data yang dikembalikan. Parameter return_type adalah instance dari kelas tablestore.metadata.ReturnType. Hanya kunci primer yang dapat dikembalikan. Dalam kebanyakan kasus, parameter ini digunakan untuk kolom kunci primer auto-increment. |
transaction_id | ID transaksi lokal. Jika Anda ingin menggunakan fitur transaksi lokal untuk menghapus data, Anda harus mengonfigurasi parameter ini. |
Contoh
Sisipkan satu baris data.
Pada contoh berikut, versi data di kolom atribut age adalah 1498184687000, yang sesuai dengan tanggal 23 Juni 2017. Parameter `max_time_deviation` ditentukan saat Anda membuat tabel. Operasi PutRow dilarang jika selisih antara waktu server saat ini dan versi data melebihi nilai parameter `max_time_deviation`.
# Tentukan nama tabel data.
table_name = '<TABLE_NAME>'
# Kolom kunci primer pertama adalah gid dan nilainya adalah integer 1. Kolom kunci primer kedua adalah uid dan nilainya adalah integer 101.
primary_key = [('gid',1), ('uid',101)]
# Baris berisi lima kolom atribut:
# Kolom atribut pertama adalah name dan nilainya adalah string John. Nomor versi data tidak ditentukan. Sistem menggunakan waktu saat ini sebagai nomor versi data.
# Kolom atribut kedua adalah mobile dan nilainya adalah integer 1390000****. Nomor versi data tidak ditentukan. Sistem menggunakan waktu saat ini sebagai nomor versi data.
# Kolom atribut ketiga adalah address dan nilainya adalah nilai biner China. Nomor versi data tidak ditentukan. Sistem menggunakan waktu saat ini sebagai nomor versi data.
# Kolom atribut keempat adalah female dan nilainya adalah nilai Boolean False. Nomor versi data tidak ditentukan. Sistem menggunakan waktu saat ini sebagai nomor versi data.
# Kolom atribut kelima adalah age dan nilainya adalah 29.7. 1498184687000 ditentukan sebagai nomor versi data.
attribute_columns = [('name','John'), ('mobile',1390000****),('address', bytearray('China', encoding='utf8')),('female', False), ('age', 29.7, 1498184687000)]
# Buat baris menggunakan primary_key dan attribute_columns.
row = Row(primary_key, attribute_columns)
# Tentukan kondisi keberadaan baris yang mengharapkan baris yang ditentukan tidak ada. Jika baris yang ditentukan ada, terjadi kesalahan Condition Update Failed.
condition = Condition(RowExistenceExpectation.EXPECT_NOT_EXIST)
try:
# Jika Anda tidak menentukan parameter ReturnType saat memanggil metode put_row, nilai parameter return_row adalah None.
consumed, return_row = client.put_row(table_name, row, condition)
# Tampilkan jumlah CU tulis yang dikonsumsi oleh permintaan.
print('put row succeed, consume %s write cu.' % consumed.write)
# Pengecualian client biasanya disebabkan oleh kesalahan parameter atau pengecualian jaringan.
except OTSClientError as e:
print("put row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message()))
# Pengecualian server biasanya disebabkan oleh kesalahan parameter atau kesalahan pembatasan kecepatan.
except OTSServiceError as e:
print("put row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id())) Untuk kode contoh lengkap, lihat PutRow@GitHub.
Perbarui satu baris data
Panggil operasi UpdateRow untuk memperbarui baris. Anda dapat menambahkan atau menghapus kolom atribut, menghapus versi tertentu dari data dalam kolom atribut, atau memperbarui nilai kolom atribut yang ada. Jika baris tidak ada, baris baru akan disisipkan.
Antarmuka
"""
Deskripsi: Operasi ini memperbarui satu baris data.
table_name: nama tabel.
row: baris yang akan diperbarui, termasuk kolom kunci primer dan kolom atribut. Kolom kunci primer dalam format list. Kolom atribut dalam format dict.
condition: kondisi yang harus dipenuhi untuk menjalankan operasi. Tablestore memeriksa apakah kondisi terpenuhi sebelum menjalankan operasi. Operasi hanya dijalankan jika kondisi terpenuhi. Parameter condition adalah instance dari kelas tablestore.metadata.Condition.
Dua jenis kondisi didukung: kondisi keberadaan baris dan kondisi nilai kolom. Untuk kondisi keberadaan baris, atur parameter condition ke IGNORE, EXPECT_EXIST, atau EXPECT_NOT_EXIST.
return_type: jenis data yang dikembalikan. Parameter return_type adalah instance dari kelas tablestore.metadata.ReturnType. Hanya kunci primer yang dapat dikembalikan. Dalam kebanyakan kasus, parameter ini digunakan untuk kolom kunci primer auto-increment.
Respons: jumlah CUs yang dikonsumsi oleh operasi dan data baris yang dikembalikan.
consumed: jumlah CUs yang dikonsumsi oleh operasi. Parameter consumed adalah instance dari kelas tablestore.metadata.CapacityUnit.
return_row: data baris yang dikembalikan.
Contoh:
primary_key = [('gid',1), ('uid',101)]
update_of_attribute_columns = {
'put' : [('name','Jack'), ('address','City A in China')],
'delete' : [('mobile', None, 1493725896147)],
'delete_all' : [('age')],
'increment' : [('counter', 1)]
}
row = Row(primary_key, update_of_attribute_columns)
condition = Condition('EXPECT_EXIST')
consumed = client.update_row('myTable', row, condition)
"""
def update_row(self, table_name, row, condition, return_type = None, transaction_id = None):Parameter
Parameter | Deskripsi |
table_name | Nama tabel data. |
row | Baris data. Parameter ini mencakup item konfigurasi berikut:
|
condition | Gunakan pembaruan bersyarat untuk menentukan kondisi keberadaan baris atau kondisi nilai kolom. |
return_type | Jenis data yang dikembalikan. Parameter return_type adalah instance dari kelas tablestore.metadata.ReturnType. Hanya kunci primer yang dapat dikembalikan. Dalam kebanyakan kasus, parameter ini digunakan untuk kolom kunci primer auto-increment. |
transaction_id | ID transaksi lokal. Jika Anda ingin menggunakan fitur transaksi lokal untuk menghapus data, Anda harus mengonfigurasi parameter ini. |
Contoh
Perbarui satu baris data.
# Tentukan nama tabel data.
table_name = '<TABLE_NAME>'
# Kolom kunci primer pertama adalah gid dan nilainya adalah integer 1. Kolom kunci primer kedua adalah uid dan nilainya adalah integer 101.
primary_key = [('gid',1), ('uid',101)]
# Pembaruan mencakup tiga bagian: PUT, DELETE, dan DELETE_ALL.
# PUT: menambahkan kolom atribut atau memperbarui nilai yang ada dalam kolom atribut. Dalam contoh ini, dua kolom atribut ditambahkan. Kolom pertama adalah name dan nilainya adalah David. Kolom kedua adalah address dan nilainya adalah Hongkong.
# DELETE: menghapus versi tertentu (stempel waktu) dari data. Dalam contoh ini, data dengan nomor versi data 1488436949003 di kolom address dihapus.
# DELETE_ALL: menghapus kolom. Dalam contoh ini, semua versi data di kolom mobile dan age dihapus.
update_of_attribute_columns = {
'PUT' : [('name','David'), ('address','Hongkong')],
'DELETE' : [('address', None, 1488436949003)],
'DELETE_ALL' : [('mobile'), ('age')],
}
row = Row(primary_key, update_of_attribute_columns)
# Atur kondisi keberadaan baris ke RowExistenceExpectation.IGNORE. Artinya, baris diperbarui terlepas dari apakah baris tersebut ada atau tidak.
condition = Condition(RowExistenceExpectation.IGNORE, SingleColumnCondition("age", 20, ComparatorType.EQUAL)) # perbarui baris hanya jika baris ini ada
try:
consumed, return_row = client.update_row(table_name, row, condition)
# Tampilkan jumlah CU tulis yang dikonsumsi oleh permintaan.
print('put row succeed, consume %s write cu.' % consumed.write)
# Pengecualian client biasanya disebabkan oleh kesalahan parameter atau pengecualian jaringan.
except OTSClientError as e:
print("update row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message()))
# Pengecualian server biasanya disebabkan oleh kesalahan parameter atau kesalahan pembatasan kecepatan.
except OTSServiceError as e:
print("update row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id()))Untuk kode contoh lengkap, lihat UpdateRow@GitHub.
Tulis beberapa baris data sekaligus
Panggil operasi BatchWriteRow untuk menulis beberapa baris atau menulis ke beberapa tabel dalam satu permintaan.
Setiap suboperasi dalam BatchWriteRow dijalankan secara independen. Tablestore mengembalikan hasil setiap suboperasi secara terpisah.
Catatan Penggunaan
Saat Anda memanggil operasi BatchWriteRow, beberapa baris mungkin gagal ditulis. Operasi ini tidak melemparkan pengecualian untuk kegagalan parsial tersebut. Sebaliknya, BatchWriteRowResponse yang dikembalikan berisi indeks dan pesan kesalahan untuk baris yang gagal. Oleh karena itu, Anda harus memeriksa nilai kembali untuk menentukan apakah setiap baris berhasil ditulis. Jika Anda tidak memeriksa nilai kembali, operasi yang gagal tersebut mungkin terlewatkan.
Jika server mendeteksi kesalahan parameter pada beberapa operasi, operasi BatchWriteRow mungkin melemparkan pengecualian kesalahan parameter. Dalam kasus ini, tidak ada operasi dalam permintaan yang dijalankan.
Antarmuka
"""
Deskripsi: Operasi ini menulis beberapa baris data sekaligus.
request = BatchWriteRowRequest()
request.add(TableInBatchWriteRowItem(table0, row_items))
request.add(TableInBatchWriteRowItem(table1, row_items))
response = client.batch_write_row(request)
response: hasil yang dikembalikan. Tipe parameter response adalah tablestore.metadata.BatchWriteRowResponse.
"""
def batch_write_row(self, request): Contoh
Tulis beberapa baris data.
put_row_items = []
# Tambahkan baris untuk operasi PutRow.
for i in range(0, 20):
primary_key = [('gid',i), ('uid',i+1)]
attribute_columns = [('name','somebody'+str(i)), ('address','somewhere'+str(i)), ('age',i)]
row = Row(primary_key, attribute_columns)
condition = Condition(RowExistenceExpectation.IGNORE)
item = PutRowItem(row, condition)
put_row_items.append(item)
# Tambahkan baris untuk operasi UpdateRow.
for i in range(0, 10):
primary_key = [('gid',i), ('uid',i+1)]
attribute_columns = {'put': [('name','somebody'+str(i)), ('address','somewhere'+str(i)), ('age',i)]}
row = Row(primary_key, attribute_columns)
condition = Condition(RowExistenceExpectation.IGNORE, SingleColumnCondition("age", i, ComparatorType.EQUAL))
item = UpdateRowItem(row, condition)
put_row_items.append(item)
# Tambahkan baris untuk operasi DeleteRow.
delete_row_items = []
for i in range(10, 20):
primary_key = [('gid',i), ('uid',i+1)]
row = Row(primary_key)
condition = Condition(RowExistenceExpectation.IGNORE)
item = DeleteRowItem(row, condition)
delete_row_items.append(item)
# Buat permintaan untuk menulis beberapa baris data sekaligus.
request = BatchWriteRowRequest()
request.add(TableInBatchWriteRowItem('<TABLE_NAME>', put_row_items))
request.add(TableInBatchWriteRowItem('<DELETE_TABLE_NAME>', delete_row_items))
# Panggil metode batch_write_row untuk menulis beberapa baris data sekaligus. Jika terjadi kesalahan seperti kesalahan parameter permintaan, pengecualian dilemparkan. Jika beberapa baris gagal, tidak ada pengecualian yang dilemparkan, tetapi item internal mungkin gagal.
try:
result = client.batch_write_row(request)
print('Result status: %s'%(result.is_all_succeed()))
# Periksa hasil operasi PutRow.
print('check first table\'s put results:')
succ, fail = result.get_put()
for item in succ:
print('Put succeed, consume %s write cu.' % item.consumed.write)
for item in fail:
print('Put failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
# Periksa hasil operasi UpdateRow.
print('check first table\'s update results:')
succ, fail = result.get_update()
for item in succ:
print('Update succeed, consume %s write cu.' % item.consumed.write)
for item in fail:
print('Update failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
# Periksa hasil operasi DeleteRow.
print('check second table\'s delete results:')
succ, fail = result.get_delete()
for item in succ:
print('Delete succeed, consume %s write cu.' % item.consumed.write)
for item in fail:
print('Delete failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
# Pengecualian client biasanya disebabkan oleh kesalahan parameter atau pengecualian jaringan.
except OTSClientError as e:
print("get row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message()))
# Pengecualian server biasanya disebabkan oleh kesalahan parameter atau kesalahan pembatasan kecepatan.
except OTSServiceError as e:
print("get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id()))Untuk kode contoh lengkap, lihat BatchWriteRow@GitHub.
FAQ
Referensi
Untuk memperbarui data dalam aplikasi dengan konkurensi tinggi berdasarkan kondisi tertentu, Anda dapat menggunakan pembaruan bersyarat. Untuk informasi lebih lanjut, lihat Konfigurasikan pembaruan bersyarat.
Untuk mengumpulkan statistik real-time untuk aplikasi online, seperti jumlah tampilan halaman (PVs) untuk topik, Anda dapat menggunakan fitur penghitung atomik. Untuk informasi lebih lanjut, lihat Gunakan fitur penghitung atomik.
Untuk melakukan operasi atomik guna menulis satu atau beberapa baris data, Anda dapat menggunakan fitur transaksi lokal. Untuk informasi lebih lanjut, lihat Gunakan fitur transaksi lokal.
Setelah Anda menulis data ke tabel, Anda dapat membaca atau menghapus data di tabel tersebut sesuai kebutuhan. Untuk informasi lebih lanjut, lihat Baca data atau Hapus data.