Rumah  >  Artikel  >  pangkalan data  >  Menggunakan MySQL dalam Go: elakkan lima kesilapan biasa

Menggunakan MySQL dalam Go: elakkan lima kesilapan biasa

WBOY
WBOYasal
2023-06-17 09:22:411188semak imbas

Bahasa Go semakin menjadi bahasa pengaturcaraan yang popular, sama seperti pangkalan data MySQL. Artikel ini akan memperkenalkan lima kesilapan biasa apabila menggunakan MySQL dalam bahasa Go supaya pembangun dapat mengelakkan kesilapan ini dan meningkatkan kualiti dan kestabilan kod.

Ralat 1: Tidak menutup sambungan pangkalan data

Apabila menggunakan MySQL, sebaiknya tutup sambungan pangkalan data secara manual selepas digunakan. Jika sambungan tidak ditutup dengan segera, sumber sistem akan sia-sia dan prestasi pangkalan data mungkin berkurangan. Untuk mengelakkan perkara ini berlaku, pembangun perlu memastikan sambungan ditutup semasa menulis kod. Berikut ialah coretan kod contoh yang menunjukkan cara menutup sambungan pangkalan data dengan betul:

// 创建数据库连接
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database")

// 检查错误
if err != nil {
    log.Fatal(err)
}

// 明确关闭数据库连接
defer db.Close()

Perhatikan kenyataan penangguhan dalam kod. Pernyataan ini akan dilaksanakan apabila fungsi kembali, memastikan sambungan pangkalan data ditutup selepas digunakan.

Ralat 2: Ralat tidak dikendalikan

Apabila menggunakan MySQL, ralat mungkin berlaku pada bila-bila masa, termasuk: kegagalan sambungan pangkalan data, ralat pernyataan pertanyaan, parameter yang salah, dsb. Pembangun perlu memastikan bahawa ralat ini dikendalikan dengan tepat untuk mengelakkan program daripada ditamatkan secara tidak normal. Berikut ialah coretan kod contoh yang menunjukkan cara menyemak ralat dan mengendalikannya:

// 执行SQL查询
rows, err := db.Query("SELECT name FROM users WHERE id = ?", 1)

// 检查错误
if err != nil {
    log.Fatal(err)
}

// 关闭 rows 对象,注意 defer
defer rows.Close()

// 遍历结果
for rows.Next() {
    var name string
    err := rows.Scan(&name)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(name)
}

Perhatikan pernyataan if dan log.Fatal() dalam kod. Kenyataan ini akan mengganggu pelaksanaan program apabila ralat berlaku dan mengeluarkan mesej ralat.

Ralat 3: Tidak dapat mengendalikan nilai NULL dengan betul

Dalam MySQL, NULL ialah nilai khas yang mewakili nilai yang hilang atau tidak diketahui. Apabila menggunakan MySQL, pembangun perlu menentukan sama ada medan jadual adalah NULL dan mengendalikan nilai NULL dengan betul. Berikut ialah coretan kod contoh yang menunjukkan cara mengendalikan nilai NULL dengan betul:

// 执行SQL查询
rows, err := db.Query("SELECT name, age FROM users WHERE id = ?", 1)

// 检查错误
if err != nil {
    log.Fatal(err)
}

// 关闭 rows 对象,注意 defer
defer rows.Close()

// 遍历结果
for rows.Next() {
    var name string
    var age sql.NullInt64
    err := rows.Scan(&name, &age)
    if err != nil {
        log.Fatal(err)
    }
    // 处理 NULL 值
    if age.Valid {
        fmt.Println(name, age.Int64)
    } else {
        fmt.Println(name, "Age is NULL")
    }
}

Perhatikan jenis sql.NullInt64 dan pernyataan if dalam kod. Kod ini akan menentukan sama ada medan umur adalah NULL apabila memproses nilai NULL Jika ya, cetak "Umur ialah NULL", jika tidak, cetak nilai umur.

Ralat 4: Menggunakan pernyataan SQL untuk menggabungkan rentetan

Menggunakan rentetan untuk menggabungkan pernyataan SQL adalah kesilapan biasa. Pendekatan ini terdedah kepada serangan suntikan SQL dan tidak kondusif untuk penyelenggaraan kod. Untuk mengelakkan perkara ini berlaku, pembangun boleh menggunakan ruang letak dan parameter SQL. Berikut ialah coretan kod sampel yang menunjukkan cara menggunakan ruang letak dan parameter:

// 定义 SQL 查询和占位符
query := "SELECT name FROM users WHERE age > ? AND gender = ?"

// 准备参数
args := []interface{}{18, "M"}

// 执行 SQL 查询
rows, err := db.Query(query, args...)
if err != nil {
    log.Fatal(err)
}

// 关闭 rows 对象,注意 defer
defer rows.Close()

// 遍历结果
for rows.Next() {
    var name string
    err := rows.Scan(&name)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(name)
}

Perhatikan ruang letak dan argumen parameter dalam kod. Kod ini menggunakan ruang letak semasa membuat pertanyaan, menggantikan kemungkinan serangan suntikan SQL dengan parameter.

Ralat 5: Teknologi pengumpulan sambungan tidak digunakan

Teknologi pengumpulan sambungan ialah teknologi pengoptimuman pangkalan data yang biasa digunakan yang boleh mengurangkan tekanan beban pada pelayan pangkalan data dan meningkatkan prestasi sistem. Apabila menggunakan MySQL, pembangun perlu menggunakan teknologi pengumpulan sambungan untuk mengurus sambungan pangkalan data. Di bawah ialah contoh coretan kod yang menunjukkan cara menggunakan teknologi pengumpulan sambungan:

// 创建连接池
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database")
if err != nil {
    log.Fatal(err)
}
db.SetMaxIdleConns(10)
db.SetMaxOpenConns(100)

// 执行 SQL 查询
rows, err := db.Query("SELECT name FROM users WHERE age > ?", 18)
if err != nil {
    log.Fatal(err)
}

// 关闭 rows 对象,注意 defer
defer rows.Close()

// 遍历结果
for rows.Next() {
    var name string
    err := rows.Scan(&name)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(name)
}

Nota SetMaxIdleConns() dan SetMaxOpenConns() dalam kod. Kod ini akan menggunakan teknologi pengumpulan sambungan untuk mengurus sambungan pangkalan data dan mengehadkan bilangan maksimum sambungan.

Ringkasan

Apabila menggunakan MySQL dalam bahasa Go, pembangun perlu mengelakkan beberapa kesilapan biasa. Ralat ini termasuk tidak menutup sambungan pangkalan data, tidak mengendalikan ralat, gagal mengendalikan nilai NULL dengan betul, menggunakan pernyataan SQL untuk menyambung rentetan, dan tidak menggunakan teknologi pengumpulan sambungan. Dengan mengelakkan ralat ini, pembangun boleh meningkatkan kualiti dan kestabilan kod mereka sambil meningkatkan prestasi sistem.

Atas ialah kandungan terperinci Menggunakan MySQL dalam Go: elakkan lima kesilapan biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn