Memproses hasil kueri Amazon RDS Data API dalam format JSON - Amazon Aurora

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memproses hasil kueri Amazon RDS Data API dalam format JSON

Ketika Anda memanggil operasi ExecuteStatement, Anda dapat memilih untuk menampilkan hasil kueri sebagai string dalam format JSON. Dengan demikian, Anda dapat menggunakan kemampuan parsing JSON bahasa pemrograman Anda untuk menafsirkan dan memformat ulang set hasil. Dengan melakukan ini, Anda dapat membantu menghindari penulisan kode tambahan untuk mengulang set hasil dan menafsirkan setiap nilai kolom.

Untuk meminta set hasil dalam format JSON, teruskan parameter formatRecordsAs opsional dengan nilai JSON. Set hasil yang diformat JSON ditampilkan di bidang formattedRecords struktur ExecuteStatementResponse.

Tindakan BatchExecuteStatement tidak menampilkan set hasil. Dengan demikian, opsi JSON tidak berlaku untuk tindakan itu.

Untuk menyesuaikan kunci dalam struktur hash JSON, tentukan alias kolom dalam set hasil. Anda dapat melakukannya dengan menggunakan klausa AS dalam daftar kolom kueri SQL Anda.

Anda dapat menggunakan kemampuan JSON untuk membuat set hasil lebih mudah dibaca dan memetakan kontennya ke kerangka kerja khusus bahasa. Karena volume set hasil berenkode ASCII lebih besar dari representasi default, Anda dapat memilih representasi default untuk kueri yang menampilkan sejumlah besar baris atau nilai kolom besar yang menghabiskan lebih banyak memori daripada yang tersedia untuk aplikasi Anda.

Mengambil hasil kueri dalam format JSON

Untuk menerima hasil yang ditetapkan sebagai string JSON, sertakan .withFormatRecordsAs(RecordsFormatType.JSON) dalam ExecuteStatement panggilan. Nilai pengembalian kembali sebagai string JSON di bidang formattedRecords. Dalam kasus ini, columnMetadata bernilai null. Label kolom adalah kunci dari objek yang mewakili setiap baris. Nama kolom ini diulang untuk setiap baris dalam set hasil. Nilai kolom adalah string berkutip, nilai numerik, atau nilai khusus yang merepresentasikan true, false, atau null. Metadata kolom seperti batasan panjang dan tipe yang tepat untuk angka dan string tidak dipertahankan dalam respons JSON.

Jika Anda menghilangkan panggilan .withFormatRecordsAs() atau menentukan parameter NONE, set hasil ditampilkan dalam format biner menggunakan bidang Records dan columnMetadata.

Pemetaan Tipe Data

Nilai SQL dalam set hasil dipetakan ke set tipe JSON yang lebih kecil. Nilai direpresentasikan dalam JSON sebagai string, angka, dan beberapa konstanta khusus seperti true, false, dan null. Anda dapat mengonversi nilai-nilai ini menjadi berbagai variabel dalam aplikasi Anda, dengan menggunakan pengetikan kuat atau lemah yang sesuai untuk bahasa pemrograman Anda.

Tipe data JDBC

Tipe data JSON

INTEGER, TINYINT, SMALLINT, BIGINT

Angka secara default. String jika opsi LongReturnType diatur ke STRING.

FLOAT, REAL, DOUBLE

Angka

DECIMAL

String secara default. Angka jika opsi DecimalReturnType diatur ke DOUBLE_OR_LONG.

STRING

String

BOOLEAN, BIT

Boolean

BLOB, BINARY, VARBINARY, LONGVARBINARY

String dalam enkode base64.

CLOB

String

ARRAY

Array

NULL

null

Tipe lainnya (termasuk tipe terkait tanggal dan waktu)

String

Pemecahan Masalah

Respons JSON dibatasi hingga 10 megabyte. Jika responsnya lebih besar dari batas ini, program Anda menerima kesalahan BadRequestException. Dalam kasus ini, Anda dapat mengatasi kesalahan menggunakan salah satu teknik berikut:

  • Kurangi jumlah baris di set hasil. Untuk melakukannya, tambahkan klausa LIMIT. Anda dapat membagi set hasil besar menjadi beberapa set yang lebih kecil dengan mengirimkan beberapa kueri dengan klausa LIMIT dan OFFSET.

    Jika set hasil menyertakan baris yang difilter oleh logika aplikasi, Anda dapat menghapus baris tersebut dari set hasil dengan menambahkan kondisi lainnya dalam klausa WHERE.

  • Kurangi jumlah kolom di set hasil. Untuk melakukannya, hapus item dari daftar pilih kueri.

  • Persingkat label kolom dengan menggunakan alias kolom dalam kueri. Setiap nama kolom diulang dalam string JSON untuk setiap baris dalam set hasil. Oleh karena itu, hasil kueri dengan nama kolom panjang dan banyak baris dapat melebihi batas ukuran. Khususnya, gunakan alias kolom untuk ekspresi rumit agar seluruh ekspresi tidak diulang dalam string JSON.

  • Meskipun Anda dapat menggunakan alias kolom dengan SQL untuk menghasilkan set hasil yang memiliki beberapa kolom dengan nama yang sama, nama kunci duplikat tidak diperbolehkan di JSON. RDS API Data menampilkan kesalahan jika Anda meminta set hasil dalam format JSON dan beberapa kolom memiliki nama yang sama. Jadi, pastikan semua label kolom memiliki nama yang unik.

Contoh

Contoh Java berikut menunjukkan cara memanggil ExecuteStatement dengan respons sebagai string berformat JSON, lalu menafsirkan set hasil. Gantikan nilai yang sesuai untukdatabaseName,secretStoreArn, dan clusterArn parameter.

Contoh Java berikut menunjukkan kueri yang menampilkan nilai numerik desimal di set hasil. Panggilan assertThat menguji apakah bidang respons memiliki properti yang diharapkan berdasarkan aturan untuk set hasil JSON.

Contoh ini bekerja dengan skema dan data sampel berikut:

create table test_simplified_json (a float); insert into test_simplified_json values(10.0);
public void JSON_result_set_demo() { var sql = "select * from test_simplified_json"; var request = new ExecuteStatementRequest() .withDatabase(databaseName) .withSecretArn(secretStoreArn) .withResourceArn(clusterArn) .withSql(sql) .withFormatRecordsAs(RecordsFormatType.JSON); var result = rdsdataClient.executeStatement(request); }

Nilai bidang formattedRecords dari program sebelumnya adalah:

[{"a":10.0}]

Bidang Records dan ColumnMetadata dalam respons keduanya bernilai null karena adanya set hasil JSON.

Contoh Java berikut menunjukkan kueri yang menampilkan nilai numerik integer di set hasil. Contoh panggilan getFormattedRecords untuk menampilkan hanya string berformat JSON dan mengabaikan bidang respons lain yang kosong atau bernilai null. Contoh ini melakukan deserialisasi hasil ke dalam struktur yang merepresentasikan daftar catatan. Setiap catatan memiliki bidang yang namanya sesuai dengan alias kolom dari set kumpulan. Teknik ini menyederhanakan kode yang mem-parsing set hasil. Aplikasi Anda tidak harus mengulang baris dan kolom dari set hasil dan mengonversi setiap nilai ke tipe yang sesuai.

Contoh ini bekerja dengan skema dan data sampel berikut:

create table test_simplified_json (a int); insert into test_simplified_json values(17);
public void JSON_deserialization_demo() { var sql = "select * from test_simplified_json"; var request = new ExecuteStatementRequest() .withDatabase(databaseName) .withSecretArn(secretStoreArn) .withResourceArn(clusterArn) .withSql(sql) .withFormatRecordsAs(RecordsFormatType.JSON); var result = rdsdataClient.executeStatement(request) .getFormattedRecords(); /* Turn the result set into a Java object, a list of records. Each record has a field 'a' corresponding to the column labelled 'a' in the result set. */ private static class Record { public int a; } var recordsList = new ObjectMapper().readValue( response, new TypeReference<List<Record>>() { }); }

Nilai bidang formattedRecords dari program sebelumnya adalah:

[{"a":17}]

Untuk mengambil kolom a baris hasil 0, aplikasi akan merujuk ke recordsList.get(0).a.

Sebaliknya, contoh Java berikut menunjukkan tipe kode yang diperlukan untuk membangun struktur data yang mempertahankan set hasil ketika Anda tidak menggunakan format JSON. Dalam kasus ini, setiap baris dari set hasil berisi bidang dengan informasi tentang satu pengguna. Membangun struktur data untuk merepresentasikan set hasil membutuhkan perulangan melalui baris. Untuk setiap baris, kode mengambil nilai setiap bidang, melakukan konversi tipe yang sesuai, dan menetapkan hasilnya ke bidang yang sesuai dalam objek yang mewakili baris. Kemudian, kode menambahkan objek yang merepresentasikan setiap pengguna ke struktur data yang mewakili seluruh set hasil. Jika kueri diubah untuk menyusun ulang, menambah, atau menghapus bidang dalam set hasil, kode aplikasi juga harus diubah.

/* Verbose result-parsing code that doesn't use the JSON result set format */ for (var row: response.getRecords()) { var user = User.builder() .userId(row.get(0).getLongValue()) .firstName(row.get(1).getStringValue()) .lastName(row.get(2).getStringValue()) .dob(Instant.parse(row.get(3).getStringValue())) .build(); result.add(user); }

Nilai sampel berikut menunjukkan nilai bidang formattedRecords untuk set hasil dengan jumlah kolom, alias kolom, dan tipe data kolom yang berbeda.

Jika set hasil mencakup beberapa baris, setiap barisnya direpresentasikan sebagai objek yang merupakan elemen array. Setiap kolom dalam set hasil menjadi kunci dalam objek. Nama kolom ini diulang untuk setiap baris dalam set hasil. Oleh karena itu, untuk set hasil yang terdiri dari banyak baris dan kolom, Anda mungkin perlu menentukan alias kolom pendek agar tidak melebihi batas panjang untuk seluruh respons.

Contoh ini bekerja dengan skema dan data sampel berikut:

create table sample_names (id int, name varchar(128)); insert into sample_names values (0, "Jane"), (1, "Mohan"), (2, "Maria"), (3, "Bruce"), (4, "Jasmine");
[{"id":0,"name":"Jane"},{"id":1,"name":"Mohan"}, {"id":2,"name":"Maria"},{"id":3,"name":"Bruce"},{"id":4,"name":"Jasmine"}]

Jika kolom dalam set hasil didefinisikan sebagai ekspresi, teks ekspresi menjadi kunci JSON. Oleh karena itu, praktik mudah umumnya adalah menentukan alias kolom deskriptif untuk setiap ekspresi dalam daftar pilih kueri. Misalnya, kueri berikut mencakup ekspresi seperti panggilan fungsi dan operasi aritmatika dalam daftar pilihannya.

select count(*), max(id), 4+7 from sample_names;

Ekspresi tersebut diteruskan ke set hasil JSON sebagai kunci.

[{"count(*)":5,"max(id)":4,"4+7":11}]

Menambahkan kolom AS dengan label deskriptif membuat kunci lebih sederhana untuk ditafsirkan dalam set hasil JSON.

select count(*) as rows, max(id) as largest_id, 4+7 as addition_result from sample_names;

Dengan kueri SQL yang direvisi, label kolom yang ditentukan oleh klausa AS digunakan sebagai nama kunci.

[{"rows":5,"largest_id":4,"addition_result":11}]

Nilai untuk setiap pasangan kunci-nilai dalam string JSON dapat berupa string berkutip. String dapat berisi karakter unicode. Jika string berisi urutan escape maupun karakter " atau \, karakter tersebut didahului oleh karakter escape backslash. Contoh string JSON berikut menunjukkan kemungkinan ini. Misalnya, hasil string_with_escape_sequences berisi karakter khusus backspace, newline, carriage return, tab, form feed, dan \.

[{"quoted_string":"hello"}] [{"unicode_string":"邓不利多"}] [{"string_with_escape_sequences":"\b \n \r \t \f \\ '"}]

Nilai untuk setiap pasangan kunci-nilai dalam string JSON juga dapat merepresentasikan angka. Angka tersebut dapat berupa bilangan bulat, nilai floating-point, nilai negatif, atau nilai yang direpresentasikan sebagai notasi eksponensial. Contoh string JSON berikut menunjukkan kemungkinan ini.

[{"integer_value":17}] [{"float_value":10.0}] [{"negative_value":-9223372036854775808,"positive_value":9223372036854775807}] [{"very_small_floating_point_value":4.9E-324,"very_large_floating_point_value":1.7976931348623157E308}]

Nilai Boolean dan null direpresentasikan dengan kata kunci khusus tanpa kutip true, false, dan null. Contoh string JSON berikut menunjukkan kemungkinan ini.

[{"boolean_value_1":true,"boolean_value_2":false}] [{"unknown_value":null}]

Jika Anda memilih nilai tipe BLOB, hasilnya direpresentasikan dalam string JSON sebagai nilai berenkode base64. Untuk mengonversi kembali nilai ke representasi aslinya, Anda dapat menggunakan fungsi dekode yang sesuai dalam bahasa aplikasi Anda. Misalnya, Anda memanggil fungsi Base64.getDecoder().decode() di Java. Output sampel berikut menunjukkan hasil pemilihan nilai BLOB hello world dan menampilkan set hasil sebagai string JSON.

[{"blob_column":"aGVsbG8gd29ybGQ="}]

Contoh Python berikut menunjukkan cara mengakses nilai-nilai dari hasil panggilan ke fungsi execute_statement Python. Set hasil adalah nilai string di bidang response['formattedRecords']. Kode ini mengubah string JSON menjadi struktur data dengan memanggil fungsi json.loads. Kemudian, setiap baris dari set hasil adalah elemen daftar dalam struktur data, dan Anda dapat merujuk ke setiap bidang set hasil berdasarkan nama dalam setiap baris.

import json result = json.loads(response['formattedRecords']) print (result[0]["id"])

JavaScript Contoh berikut menunjukkan cara mengakses nilai-nilai dari hasil panggilan ke JavaScript executeStatement fungsi. Set hasil adalah nilai string di bidang response.formattedRecords. Kode ini mengubah string JSON menjadi struktur data dengan memanggil fungsi JSON.parse. Kemudian, setiap baris dari set hasil adalah elemen array dalam struktur data, dan Anda dapat merujuk ke setiap bidang set hasil berdasarkan nama dalam setiap baris.

<script> const result = JSON.parse(response.formattedRecords); document.getElementById("display").innerHTML = result[0].id; </script>