Go で MySQL を使用する: 5 つのよくある間違いを避ける

WBOY
リリース: 2023-06-17 09:22:41
オリジナル
1190 人が閲覧しました

Go 言語は、データベース MySQL と同様に、ますます人気のあるプログラミング言語になりつつあります。この記事では、開発者がこれらの間違いを回避し、コードの品質と安定性を向上できるように、Go 言語で MySQL を使用するときによくある 5 つの間違いを紹介します。

エラー 1: データベース接続が閉じられていない

MySQL を使用する場合は、使用後にデータベース接続を手動で閉じることをお勧めします。接続がすぐに閉じられないと、システム リソースが浪費され、データベースのパフォーマンスが低下する可能性があります。このような事態を避けるために、開発者はコードを記述するときに接続が閉じられていることを確認する必要があります。以下に、データベース接続を適切に閉じる方法を示すサンプル コード スニペットを示します。

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

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

// 明确关闭数据库连接
defer db.Close()
ログイン後にコピー

コード内の defer ステートメントに注意してください。このステートメントは関数が戻るときに実行され、使用後にデータベース接続が確実に閉じられます。

エラー 2: ハンドルされないエラー

MySQL を使用すると、データベース接続の失敗、クエリ ステートメントのエラー、不正なパラメーターなどのエラーがいつでも発生する可能性があります。開発者は、プログラムが異常終了しないように、これらのエラーが正確に処理されるようにする必要があります。以下に、エラーを確認して処理する方法を示すサンプル コード スニペットを示します。

// 执行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)
}
ログイン後にコピー

コード内の if ステートメントと log.Fatal() に注意してください。このステートメントは、エラーが発生したときにプログラムの実行を中断し、エラー メッセージを出力します。

エラー 3: NULL 値を正しく処理できません

MySQL では、NULL は欠落値または不明な値を表す特別な値です。 MySQL を使用する場合、開発者はテーブルのフィールドが NULL かどうかを判断し、NULL 値を正しく処理する必要があります。 NULL 値を適切に処理する方法を示すサンプル コード スニペットを次に示します。

// 执行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")
    }
}
ログイン後にコピー

コード内の sql.NullInt64 型と if ステートメントに注意してください。このコードは、NULL 値を処理するときに年齢フィールドが NULL かどうかを判断します。NULL の場合は「Age is NULL」を出力し、それ以外の場合は年齢値を出力します。

エラー 4: SQL ステートメントを使用して文字列を結合する

文字列を使用して SQL ステートメントを結合するのは、よくある間違いです。このアプローチは SQL インジェクション攻撃に対して脆弱であり、コードのメンテナンスには役立ちません。このような事態を避けるために、開発者は SQL プレースホルダーとパラメーターを使用できます。以下に、プレースホルダーとパラメーターの使用方法を示すサンプル コード スニペットを示します。

// 定义 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)
}
ログイン後にコピー

コード内のプレースホルダーとパラメーター引数に注意してください。このコードはクエリ時にプレースホルダーを使用し、考えられる SQL インジェクション攻撃をパラメーターに置き換えます。

エラー 5: 接続プール テクノロジを使用していない

接続プール テクノロジは、一般的に使用されるデータベース最適化テクノロジであり、データベース サーバーの負荷圧力を軽減し、システム パフォーマンスを向上させることができます。 MySQL を使用する場合、開発者は接続プーリング テクノロジを使用してデータベース接続を管理する必要があります。以下は、接続プーリング テクノロジの使用方法を示すサンプル コード スニペットです。

// 创建连接池
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)
}
ログイン後にコピー

コード内の SetMaxIdleConns() と SetMaxOpenConns() に注意してください。このコードは、接続プーリング テクノロジを使用してデータベース接続を管理し、最大接続数を制限します。

概要

Go 言語で MySQL を使用する場合、開発者はいくつかのよくある間違いを避ける必要があります。これらのエラーには、データベース接続を閉じていない、エラーを処理していない、NULL 値を正しく処理できない、SQL ステートメントを使用して文字列を結合しない、接続プーリング テクノロジを使用していないなどが含まれます。これらのエラーを回避することで、開発者はシステムのパフォーマンスを向上させながら、コードの品質と安定性を向上させることができます。

以上がGo で MySQL を使用する: 5 つのよくある間違いを避けるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート