Pengenalan
Di alam manipulasi pangkalan data menggunakan Go dan Postgresql, persoalan yang berlarutan timbul: kenapa perlu bersusah payah DB.exec() atau menyediakan kenyataan apabila Go nampaknya mengautomasikan penciptaan mereka? Artikel ini menyelidiki selok-belok melaksanakan operasi yang tidak mengembalikan baris dan menjelaskan rasional di sebalik penggunaan pernyataan yang disediakan.
Mengapa Gunakan DB.exec()?
Walaupun benar itu DB.Query() dan DB.exec() boleh digunakan secara bergantian untuk melaksanakan pernyataan SQL, mereka berbeza dalam jenis hasil yang mereka kembalikan. DB.exec() memberikan cerapan tentang bilangan baris yang dipengaruhi oleh pertanyaan, manakala DB.Query() mengembalikan set hasil.
Sebagai contoh, katakan anda ingin melaksanakan kenyataan DELETE dan pastikan bilangan baris yang dipadam. Menggunakan DB.exec() ialah pendekatan pilihan:
res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now()) if err != nil { panic(err) } numDeleted, err := res.RowsAffected() if err != nil { panic(err) } print(numDeleted)
Sebagai alternatif, pendekatan yang lebih rumit akan melibatkan penggunaan DB.Query() dan gelung melalui baris untuk mengiranya:
rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = RETURNING *`, time.Now()) if err != nil { panic(err) } defer rows.Close() var numDeleted int for rows.Next() { numDeleted += 1 } if err := rows.Err(); err != nil { panic(err) } print(numDeleted)
Selain itu, apabila hasil pertanyaan tidak relevan dan anda hanya perlu melaksanakannya, DB.exec() menawarkan penyelesaian ringkas:
if _, err := db.Exec(`<my_sql_query>`); err != nil { panic(err) }
Sebaliknya, meninggalkan panggilan tutup untuk DB.Rows nilai apabila menggunakan DB.Query() akhirnya akan membawa kepada beban sambungan terbuka yang berlebihan disebabkan oleh memori kebocoran.
Menyelidiki Penyata Disediakan
Walaupun dicadangkan bahawa Go secara automatik mencipta kenyataan yang disediakan, realiti nampaknya lebih bernuansa. Tingkah laku DB.Query() nampaknya bergantung pada pemacu asas yang digunakan.
Walau bagaimanapun, penyediaan dan penggunaan semula DB.Stmt boleh meningkatkan prestasi untuk kerap dilaksanakan pertanyaan. Sepintas lalu dokumentasi Postgresql rasmi mendedahkan cara penyataan yang disediakan boleh mengoptimumkan operasi.
Kesimpulan
Memahami perbezaan antara DB.exec() dan kenyataan yang disediakan di Golang membantu pembangun melaksanakan operasi yang tidak mengembalikan baris dengan cekap dan memanfaatkan faedah disediakan kenyataan apabila mencari pengoptimuman prestasi.
Atas ialah kandungan terperinci Patutkah Saya Menggunakan `DB.exec()` atau Penyata Disediakan dalam Go for Queries Without Result Rows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!