ホームページ >バックエンド開発 >Golang >SET 変数を使用して Go for MySQL クエリの構文エラーを解決する方法

SET 変数を使用して Go for MySQL クエリの構文エラーを解決する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-10-24 04:33:30851ブラウズ

How to Resolve Syntax Errors in Go for MySQL Queries Using SET Variables?

Go での SET 変数を使用した MySQL クエリ

Go では、MySQL クエリを実行する前に SET ステートメントを使用できます。ただし、満たさなければならない特定の構文要件があります。この記事では、このようなクエリを実行しようとしたときに発生する問題を調査し、解決策を提供します。

元のコード スニペットには、ユーザー ID と並べ替えパラメーターに基づいてレコードを選択する関数の定義が含まれています。クエリを実行する前に、SET ステートメントを使用して変数に値を割り当てます。ただし、このアプローチを Go で実行すると構文エラーが発生しました。

エラーは、クエリの構築方法に原因がある可能性があります。具体的には、SET ステートメントをかっこでカプセル化し、SELECT ステートメントの前に配置する必要があります。さらに、MySQL DSN には設定「multiStatements=true」と「interpolateParams=true」が含まれている必要があります。

次の更新されたコード スニペットは問題を解決します。

<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) {
    query := `
    (SET @user_id := ?, @orderBy := ?;)
    SELECT
        *
    FROM
        inventory
    WHERE
        user_id = @user_id
    ORDER BY
        (CASE WHEN @orderBy = 'type,asc' THEN type END),
        (CASE WHEN @orderBy = 'type,desc' THEN type END) DESC,
        (CASE WHEN @orderBy = 'visible,asc' THEN visible END),
        (CASE WHEN @orderBy = 'visible,desc' THEN visible END) DESC,
        (CASE WHEN @orderBy = 'create_date,asc' THEN create_date END),
        (CASE WHEN @orderBy = 'create_date,desc' THEN create_date END) DESC,
        (CASE WHEN @orderBy = 'update_date,asc' THEN update_date END),
        (CASE WHEN @orderBy = 'update_date,desc' THEN update_date END) DESC
    LIMIT ?,?;
    `

    dsn := d.dsn + "?multiStatements=true&interpolateParams=true"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        return nil, err
    }
    defer db.Close()

    rows, err := db.Query(
        query,
        uid,
        srt,
        pg*lim,
        lim,
    )

    if err != nil {
        return nil, err
    }
    defer rows.Close()

    result := make([]Inventory, 0)
    for rows.Next() {
        var inv Inventory
        if err := rows.Scan(
            &inv.Id,
            &inv.UserId,
            &inv.Type,
            &inv.Name,
            &inv.Description,
            &inv.Visible,
            &inv.CreateDate,
            &inv.UpdateDate); err != nil {
            return result, err
        }
        result = append(result, inv)
    }
    if err = rows.Err(); err != nil {
        return result, err
    }

    return result, nil
}</code>

SET ステートメントを囲むことにより、括弧内で DSN でマルチステートメントとパラメーター補間を有効にすると、クエリは構文エラーなしで Go で正常に実行されます。さらに、データベースとテーブルを utf8mb4_general_ci 照合順序に変換すると、文字セットの互換性に関連する潜在的な問題が解決されます。

以上がSET 変数を使用して Go for MySQL クエリの構文エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。