Pergi dan SQL: Masalah dengan perpustakaan yang ada (dan solusi yang lebih baik) Oleh Vinicius Garcia | Juni 2022

Programming

[ad_1]
Hai Sob di suratpembaca.web.id. Kali ini kita akan membahas tentang Linux yaitu Pergi dan SQL: Masalah dengan perpustakaan yang ada (dan solusi yang lebih baik) Oleh Vinicius Garcia | Juni 2022

.

Semoga artikel mengenai Pergi dan SQL: Masalah dengan perpustakaan yang ada (dan solusi yang lebih baik) Oleh Vinicius Garcia | Juni 2022

bisa memberikan manfaat bagi Sahabat semua. Mari baca postingan ini
sampai tuntas.

Temui KSQL – perpustakaan yang saya tulis untuk mengatasi masalah Golang dan SQL

Foto Chinami Batar di Unsplash

Selama bertahun-tahun saya bekerja dengan Golang, saya sampai pada kesimpulan bahwa bekerja dengan SQL masih bukan masalah yang baik. Menggunakan perpustakaan yang kami miliki tidak mudah dan ada banyak cara untuk memotret diri sendiri.

Untuk mengilustrasikan poin ini, saya akan mencoba menjelaskan semua masalah ini secara rinci dalam artikel ini dan kemudian merangkum solusi yang saya temukan untuk memecahkan masalah ini: Perpustakaan yang saya tulis bernama KSQL .

Pada bagian berikut, kita akan membahas tiga perpustakaan secara rinci di ekosistem Glang:

  • Perpustakaan Standar: database/sql
  • Hamparan pustaka standar yang menambahkan beberapa fitur keren seperti pemindaian struktur: sqlx
  • Driver khusus untuk Postgres yang lebih cepat daripada alternatif dan dapat digunakan bersama database/sql Atau sqlx: pgx

Masalah ini paling jelas saat menulis kueri untuk membaca beberapa baris dari database.

Saat melakukan ini, kami sebenarnya harus menguji 4 kali menggunakan kesalahan database/sql Atau sqlx Dan 3 kali untuk pgx.

Dan bagian yang menakutkan tentang ini adalah kebanyakan orang bahkan tidak mengetahui hal ini dan biasanya hanya menguji untuk melihat apakah Query() Berhasil dan jika ada panggilan ke .Scan() Itu berhasil.

Jadi jika kita benar-benar melihat semua kesalahan ini, kode kita terlihat seperti ini:

Perhatikan bahwa saat menggunakan pgx the .Close() Fungsi tersebut sebenarnya tidak mengembalikan kesalahan, jadi Anda harus mengujinya 3 kali, bukan 4 kali.

Dan jika Anda pernah menggunakan salah satu perpustakaan ini, saya yakin Anda tidak mencoba semua 4 kesalahan, dan itu biasanya baik-baik saja.

Tapi saya masih lebih suka bahwa perpustakaan kami tidak harus membuat keputusan antara tinjauan kesalahan profil tinggi dan mengabaikan kesalahan yang sangat jarang terjadi.

Jadi seperti yang ditunjukkan pada contoh di atas, kita perlu memanggil defer rows.Close(). Jika kita tidak memanggilnya, kita akan menemui kesalahan yang sangat serius, koneksi kita tidak akan pernah dilepaskan, dan akhirnya kode kita akan berhenti setelah beberapa saat tanpa pesan kesalahan.

Lebih buruk lagi, jika Anda melakukan ini pada kueri di seluruh sistem Anda, itu mungkin masih lulus semua tes integrasi Anda dan bahkan tinjauan kode Anda berhasil, karena menemukan baris yang hilang Ini tidak nyaman dan dapat menyebabkan masalah produksi. .

Bahkan jika Anda tidak pernah lupa panggilannya rows.Close() Masih ada masalah lain yang dapat dengan mudah diabaikan dalam tinjauan kode dan pengujian integrasi. Masalah ini ditunjukkan dalam contoh kode berikut:

Dalam contoh terakhir ini, banyak pembaca mungkin tidak mengidentifikasi masalahnya, dan jika Anda melakukannya, saya yakin salah satu anggota tim Anda mungkin melewatkannya.

Jika Anda menjalankan kode ini, sebagian besar waktu berfungsi dalam produksi, tetapi terkadang itu membuat Anda takut. Dengan kata lain, salah satu jenis masalah debug terburuk: hanya terjadi sesekali. Jadi apa yang terjadi di sana?

Masalahnya adalah di mana kita memanggil rows.Close() Artinya, sebelum memeriksa kesalahan, bukan setelah, jadi jika panggilan ke db.Query(...) Mengembalikan kesalahan dan kemudian rows Akan menjadi variabel nilArtinya memanggil defer rows.Close() Akan mencoba memanggil metode pada a nil Nilai di akhir fungsi menakutkan ketika penangguhan dieksekusi.

Sekali lagi, apa yang membuat masalah ini sangat mengkhawatirkan adalah ia dapat dengan mudah melewati tinjauan kode dan berbagai jenis tes integrasi.

Ini mungkin situasi yang sangat akrab: kita memiliki struktur, misalkan a Userstruct dan kita harus membuat daftar semua properti dari struktur ini baik dalam kueri maupun dalam argumen yang dikirim ke sana .Scan() Setiap kali kami membaca setiap permintaan yang dibaca pengguna.

Untuk mengilustrasikannya, misalkan salah satu kueri ini terlihat seperti ini:

Dalam contoh kecil ini, tampilannya tidak terlalu buruk, tetapi jika Anda memiliki struktur dengan lebih dari 50 fitur, itu bisa sangat buruk. Dan lebih buruk lagi jika kita berasumsi untuk memindai 5 hingga 7 kueri di masing-masing struktur ini.

Saya harap saya dapat menggambarkan betapa buruknya masalah ini pada basis kode yang besar.

Tetapi sebelum melanjutkan: poin ini perlu disebutkan saat menggunakan sqlx Anda harus menggunakan .Scan() Fungsi yang dapat Anda gunakan StructScan() Ganti fungsinya, jadi contoh ini meningkat hingga 50%.

Ada juga perpustakaan besar yang memiliki StructScan() Sebuah fitur yang disebut Scany. Dan itu bisa digunakan di atasnya database/sql Dan pgx Untuk memperluas dua perpustakaan ini dengan StructScan() Properti.

tapi belum. Kedua solusi ini masih mengharuskan Anda untuk membuat daftar semua properti struktur Anda di setiap kueri, jadi Anda tidak benar-benar menyingkirkan semua kode duplikat.

Jadi jika tidak ada solusi di atas yang digunakan, ini adalah konsekuensi utama dari masalah ini:

  1. Sepasang yang sangat ketat antara urutan sifat-sifat di SELECT Bagian dari kueri dan urutan atribut yang dikirim ke .Scan(). Karena jika urutan kedua daftar tidak cocok, Anda mungkin mengalami kesalahan pemindaian yang tidak terduga atau lebih buruk: kesalahan diam di mana Anda memuat variabel Anda dengan nilai yang salah tetapi program terus bekerja. Ini adalah masalah yang sangat buruk karena dapat dengan mudah melalui proses peninjauan kode, jadi tes integrasi selalu disarankan.
  2. Menambahkan atau menghapus properti dari struktur mungkin akan memaksa Anda untuk memperbarui semua nilai ini di semua kueri, yang merupakan operasi rumit karena masalah pemesanan yang disebutkan di atas.
  3. Dan juga masalah kecil dalam keterbacaan: Potongan besar kode dengan informasi sepele tidak berguna ketika Anda ingin menemukan potongan logis tertentu dalam kode Anda.

Ya itu betul. Saya menulis perpustakaan yang sangat menarik ini bernama KSQL. Dan saya percaya itu memiliki solusi hebat untuk masalah yang disebutkan di atas.

Karena tujuan dari posting ini bukan untuk menjelaskan argumen dan semua fitur yang dimiliki KSQL, saya akan mencoba menjelaskan secara singkat dan memberikan contoh singkat tentang bagaimana KSQL membuatnya lebih mudah untuk menangani masalah ini dan menambahkan sedikit kerumitan padanya. .

Contoh sederhana berikut menanyakan beberapa nilai dalam irisan struktur dan menggunakan tag struktur untuk yang berikut:

  1. membuat SELECT Bagian dari kueri untuk Anda (jangan khawatir ini adalah fitur opsional, dan disimpan dalam cache, sehingga sangat efisien, lihat kriteria perbandingan kami).
  2. Tentukan kolom mana yang harus dipindai di fitur struktur mana (sekali lagi, bagian refleksi dilakukan hanya sekali dan disimpan dalam cache, sehingga efisien, jadi lihat kriteria kami untuk perbandingan).

Nah, Anda mungkin dapat melihat bahwa ini jauh lebih mudah sekarang daripada dengan perpustakaan lain mana pun, tetapi mari kita bahas lebih detail tentang masing-masing masalah yang disebutkan sebelumnya:

Solusi untuk Masalah 1: Penanganan kesalahan yang berlebihan

KSQL API dirancang dengan gagasan bahwa ia kembali hanya setelah semua operasi dilakukan, artinya ia mengembalikan hanya satu kesalahan, dan memastikan bahwa semua sumber kesalahan yang mungkin diperiksa secara internal, termasuk panggilan. rows.Err()kan .Scan() Dan .Close() .

Solusi untuk Edisi 2 dan 3: Panggilan defer rows.Close()

Tidak perlu menelepon rows.Close().

Justru karena fungsi kembali hanya setelah seluruh proses selesai, kita dapat memanggilnya secara internal dan menyelamatkan pengguna dari menghadapi kerumitan tambahan ini.

Solusi untuk Masalah 4: Pengulangan nama atribut yang tidak perlu

Untuk mengatasi masalah penyalinan nama ini, KSQL memiliki dua fitur:

  1. Ini menciptakan perawatan opsional SELECT Bagian dari kueri untuk Anda, perilaku ini hanya akan diaktifkan jika kueri Anda dimulai dengannya FROM Jadi dalam situasi di mana Anda ingin lebih tepat SELECTCukup tulis bagian dari kueri dan itu akan berfungsi seperti yang diharapkan.
  2. Secara otomatis memetakan setiap kolom yang dikembalikan dalam kueri ke nama dalam tag di struktur Anda.

Jika Anda tahu betapa rumitnya berurusan dengan SQL, Anda mungkin masih ragu.

Misalnya, apa yang terjadi jika kita memuat jumlah pengguna yang dapat kita simpan di memori?

Atau bagaimana jika kita kehilangan banyak efisiensi untuk mendapatkan abstraksi ini?

KSQL mengatasi masalah ini, dan saya mengundang Anda untuk membaca file README KSQL sampai saya memiliki artikel yang berfokus untuk menjelaskan keputusan desain KSQL secara lebih rinci.

KSQL adalah ide baru, jadi pesimisme tentang fitur, kinerja, cakupan pengujian, dan konsistensi adalah hal yang baik (bukan berarti saya juga tidak membicarakannya), tetapi dengan beberapa masalah serius dalam memanfaatkan perpustakaan Go secara maksimal. untuk SQL.

Perlu juga dicatat bahwa KSQL bukan ORM, abstraksi ini sederhana dan dibatasi secara tepat untuk menghindari jebakan ORM yang umum, ini hanyalah alternatif cerdas untuk perpustakaan seperti sqlx Dan pgx Dengan membuat kueri dan mengurangi kinerja sesedikit mungkin.

Dalam tolok ukur kami, mudah untuk melihat bahwa kami praktis bertindak seperti perpustakaan lain ini, dan maksud saya nilai tolok ukur di setiap proses sangat berbeda, jadi sulit untuk tepat, tetapi saya kira KSQL 1% lebih lambat dibandingkan pgx Di Postgres dan sqlx Di semua database lainnya

Itu tadi pembahasan tentang Pergi dan SQL: Masalah dengan perpustakaan yang ada (dan solusi yang lebih baik) Oleh Vinicius Garcia | Juni 2022

, terimakasih telah mengunjungi website ini, mudah-mudahan artikelnya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.