Go の Query() メソッドを使用するときに、SET 変数を使用して MySQL クエリを実行できますか?

Susan Sarandon
リリース: 2024-10-24 02:37:02
オリジナル
352 人が閲覧しました

Can You Execute MySQL Queries with SET Variables when Using Go's Query() Method?

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

背景:

ユーザーは次のことを試みていますGo を使用して、クエリを実行する前にユーザー変数を設定する複雑な MySQL クエリを実行します。クエリはコンソールからは正常に実行されますが、Go で実行すると構文エラーが発生して失敗します。ユーザーは、Go の Query() メソッドで SET 変数を使用できるかどうか疑問に思っています。

解決策:

ユーザーの問題は、次の変更を行うことで解決されました。

  1. DSN 構成:

    • データベースへの接続時に使用される DSN に ?multiStatements=true&interpolateParams=true を追加しました。これにより、1 回の呼び出しで複数のステートメントを実行でき、パラメータ補間が可能になります。
  2. データベースとテーブルの変換:

    • データベースと関連テーブルを utf8mb4_general_ci 照合順序に変換しました。これにより、照合順序の不一致に関連するエラーが解決されました。

コード:

これらの変更により、ユーザーが提供したコードは機能するはずです。期待どおり:

<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 ?,?;
    `

    rows, err := d.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>
ログイン後にコピー

DSN 構成を変更し、データベースとテーブルを適切な照合順序に変換することにより、ユーザーは構文エラーを回避しながら問題のクエリを正常に実行できます。

以上がGo の Query() メソッドを使用するときに、SET 変数を使用して MySQL クエリを実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!