Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Driver Amazon QLDB untuk Go - Tutorial mulai cepat
Dalam tutorial ini, Anda belajar cara mengatur aplikasi sederhana menggunakan versi terbaru dari driver Amazon QLDB untuk Go. Panduan ini mencakup langkah-langkah untuk menginstal driver dan contoh kode pendek operasi dasar buat, baca, perbarui, dan hapus atau create, read, update, and delete (CRUD).
Topik
- Prasyarat
- Langkah 1: Instal driver
- Langkah 2: Impor paket
- Langkah 3: Menginisialisasi driver
- Langkah 4: Buat tabel dan indeks
- Langkah 5: Masukkan dokumen
- Langkah 6: Kueri-lah dokumen
- Langkah 7: Perbarui dokumen
- Langkah 8: Kueri-lah dokumen yang diperbarui
- Langkah 9: Jatuhkan tabel
- Menjalankan aplikasi lengkap
Prasyarat
Sebelum memulai, pastikan Anda melakukan hal berikut:
-
Selesaikan driverPrasyarat untuk Go, jika Anda belum memilihnya. Ini termasuk mendaftarAWS, memberikan akses terprogram untuk pengembangan, dan menginstal Go.
-
Buat buku besar bernama
quick-start
.Untuk mempelajari cara membuat buku besar, lihatOperasi dasar untuk buku besar Amazon QLDB atauLangkah 1: Membuat buku besar baru di Memulai konsol.
Langkah 1: Instal driver
Pastikan proyek Anda menggunakan modul Go
Di direktori proyek Anda, masukkango get
perintah berikut.
$
go get -u github.com/awslabs/amazon-qldb-driver-go/v3/qldbdriver
Menginstal driver juga menginstal dependensinya, termasuk paket AWS SDK for Gov2
Langkah 2: Impor paket
ImporAWS paket berikut.
import ( "context" "fmt" "github.com/amzn/ion-go/ion" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/qldbSession" "github.com/awslabs/amazon-qldb-driver-go/v3/qldbdriver" )
Langkah 3: Menginisialisasi driver
Inisialisasi sebuah instance dari driver yang terhubung ke buku besar bernamaquick-start
.
cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { panic(err) } qldbSession := qldbsession.NewFromConfig(cfg, func(options *qldbsession.Options) { options.Region = "
us-east-1
" }) driver, err := qldbdriver.New( "quick-start", qldbSession, func(options *qldbdriver.DriverOptions) { options.LoggerVerbosity = qldbdriver.LogInfo }) if err != nil { panic(err) } defer driver.Shutdown(context.Background())
catatan
Dalam contoh kode ini, ganti us-timur-1
denganWilayah AWS tempat Anda membuat buku besar Anda.
Langkah 4: Buat tabel dan indeks
Contoh kode berikut menunjukkan cara menjalankanCREATE TABLE
danCREATE
INDEX
pernyataan.
_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { _, err := txn.Execute("CREATE TABLE People") if err != nil { return nil, err } // When working with QLDB, it's recommended to create an index on fields we're filtering on. // This reduces the chance of OCC conflict exceptions with large datasets. _, err = txn.Execute("CREATE INDEX ON People (firstName)") if err != nil { return nil, err } _, err = txn.Execute("CREATE INDEX ON People (age)") if err != nil { return nil, err } return nil, nil }) if err != nil { panic(err) }
Kode ini membuat tabel bernamaPeople
, dan indeks untukfirstName
danage
bidang pada tabel itu. Indeks diperlukan untuk mengoptimalkan kinerja kueri dan membantu membatasi pengecualian konflik kontrol konkurensi (OCC) yang optimis.
Langkah 5: Masukkan dokumen
Contoh kode berikut menunjukkan cara menjalankanINSERT
pernyataan. QLDB mendukung bahasa kueri PartiQL (kompatibel dengan SQL) dan format data Amazon Ion (superset JSON).
Menggunakan literal PartiQL
Kode berikut menyisipkan dokumen ke dalamPeople
tabel menggunakan string pernyataan PartiQL literal.
_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People {'firstName': 'Jane', 'lastName': 'Doe', 'age': 77}") }) if err != nil { panic(err) }
Menggunakan tipe data Ion
Mirip dengan paket JSON
-
Misalkan Anda memiliki struktur Go berikut bernama
Person
.type Person struct { FirstName string `ion:"firstName"` LastName string `ion:"lastName"` Age int `ion:"age"` }
-
Buat instans
Person
.person := Person{"John", "Doe", 54}
Driver marshals representasi teks ION-dikodekan
person
untuk Anda.penting
Agar marshal dan unmarshal berfungsi dengan baik, nama bidang struktur data Go harus diekspor (huruf pertama dikapitalisasi).
-
Lulus
person
instance keExecute
metode transaksi._, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People ?", person) }) if err != nil { panic(err) }
Contoh ini menggunakan tanda tanya (
?
) sebagai placeholder variabel untuk meneruskan informasi dokumen untuk pernyataan. Saat Anda menggunakan placeholder, Anda harus meneruskan nilai teks yang dikodekan ION.Tip
Untuk menyisipkan beberapa dokumen dengan menggunakanSISIPKAN pernyataan tunggal, Anda dapat melewati parameter daftar jenis untuk pernyataan sebagai berikut.
// people is a list txn.Execute("INSERT INTO People ?", people)
Anda tidak melampirkan variabel placeholder (
?
) dalam kurung sudut ganda (<<...>>
) ketika melewati daftar. Dalam pernyataan PartiQL manual, kurung sudut ganda menunjukkan koleksi unordered dikenal sebagai tas.
Langkah 6: Kueri-lah dokumen
Contoh kode berikut menunjukkan cara menjalankanSELECT
pernyataan.
p, err := driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE age = 54") if err != nil { return nil, err } // Assume the result is not empty hasNext := result.Next(txn) if !hasNext && result.Err() != nil { return nil, result.Err() } ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } return *temp, nil }) if err != nil { panic(err) } var returnedPerson Person returnedPerson = p.(Person) if returnedPerson != person { fmt.Print("Queried result does not match inserted struct") }
Contoh ini query dokumen Anda dariPeople
tabel, mengasumsikan bahwa hasil set tidak kosong, dan mengembalikan dokumen Anda dari hasil.
Langkah 7: Perbarui dokumen
Contoh kode berikut menunjukkan cara menjalankanUPDATE
pernyataan.
person.Age += 10 _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("UPDATE People SET age = ? WHERE firstName = ?", person.Age, person.FirstName) }) if err != nil { panic(err) }
Langkah 8: Kueri-lah dokumen yang diperbarui
Contoh kode berikut queryPeople
tabel olehfirstName
dan mengembalikan semua dokumen dalam hasil set.
p, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE firstName = ?", person.FirstName) if err != nil { return nil, err } var people []Person for result.Next(txn) { ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } people = append(people, *temp) } if result.Err() != nil { return nil, result.Err() } return people, nil }) if err != nil { panic(err) } var people []Person people = p.([]Person) updatedPerson := Person{"John", "Doe", 64} if people[0] != updatedPerson { fmt.Print("Queried result does not match updated struct") }
Langkah 9: Jatuhkan tabel
Contoh kode berikut menunjukkan cara menjalankanDROP TABLE
pernyataan.
_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("DROP TABLE People") }) if err != nil { panic(err) }
Menjalankan aplikasi lengkap
Contoh kode berikut adalah versi lengkap dari aplikasi. Alih-alih melakukan langkah-langkah sebelumnya secara individual, Anda juga dapat menyalin dan menjalankan contoh kode ini dari awal hingga akhir. Aplikasi ini menunjukkan beberapa operasi CRUD dasar pada buku besar bernamaquick-start
.
catatan
Sebelum Anda menjalankan kode ini, pastikan bahwa Anda belum memiliki tabel aktif bernamaPeople
dalamquick-start
buku besar.
package main import ( "context" "fmt" "github.com/amzn/ion-go/ion" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/qldbsession" "github.com/awslabs/amazon-qldb-driver-go/v2/qldbdriver" ) func main() { awsSession := session.Must(session.NewSession(aws.NewConfig().WithRegion("
us-east-1
"))) qldbSession := qldbsession.New(awsSession) driver, err := qldbdriver.New( "quick-start", qldbSession, func(options *qldbdriver.DriverOptions) { options.LoggerVerbosity = qldbdriver.LogInfo }) if err != nil { panic(err) } defer driver.Shutdown(context.Background()) _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { _, err := txn.Execute("CREATE TABLE People") if err != nil { return nil, err } // When working with QLDB, it's recommended to create an index on fields we're filtering on. // This reduces the chance of OCC conflict exceptions with large datasets. _, err = txn.Execute("CREATE INDEX ON People (firstName)") if err != nil { return nil, err } _, err = txn.Execute("CREATE INDEX ON People (age)") if err != nil { return nil, err } return nil, nil }) if err != nil { panic(err) } _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People {'firstName': 'Jane', 'lastName': 'Doe', 'age': 77}") }) if err != nil { panic(err) } type Person struct { FirstName string `ion:"firstName"` LastName string `ion:"lastName"` Age int `ion:"age"` } person := Person{"John", "Doe", 54} _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People ?", person) }) if err != nil { panic(err) } p, err := driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE age = 54") if err != nil { return nil, err } // Assume the result is not empty hasNext := result.Next(txn) if !hasNext && result.Err() != nil { return nil, result.Err() } ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } return *temp, nil }) if err != nil { panic(err) } var returnedPerson Person returnedPerson = p.(Person) if returnedPerson != person { fmt.Print("Queried result does not match inserted struct") } person.Age += 10 _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("UPDATE People SET age = ? WHERE firstName = ?", person.Age, person.FirstName) }) if err != nil { panic(err) } p, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE firstName = ?", person.FirstName) if err != nil { return nil, err } var people []Person for result.Next(txn) { ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } people = append(people, *temp) } if result.Err() != nil { return nil, result.Err() } return people, nil }) if err != nil { panic(err) } var people []Person people = p.([]Person) updatedPerson := Person{"John", "Doe", 64} if people[0] != updatedPerson { fmt.Print("Queried result does not match updated struct") } _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("DROP TABLE People") }) if err != nil { panic(err) } }