Heim  >  Artikel  >  Backend-Entwicklung  >  Wie behebe ich Syntaxfehler in Go für MySQL-Abfragen mithilfe von SET-Variablen?

Wie behebe ich Syntaxfehler in Go für MySQL-Abfragen mithilfe von SET-Variablen?

Susan Sarandon
Susan SarandonOriginal
2024-10-24 04:33:30780Durchsuche

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

MySQL-Abfragen mit SET-Variablen in Go

In Go ist es möglich, SET-Anweisungen zu verwenden, bevor MySQL-Abfragen ausgeführt werden. Allerdings müssen bestimmte Syntaxanforderungen erfüllt sein. In diesem Artikel wird ein Problem untersucht, das beim Versuch, solche Abfragen auszuführen, auftritt, und eine Lösung bereitgestellt.

Der ursprüngliche Codeausschnitt beinhaltet die Definition einer Funktion, die Datensätze basierend auf einer Benutzer-ID und einem Sortierparameter auswählt. Es verwendet SET-Anweisungen, um Variablen Werte zuzuweisen, bevor die Abfrage ausgeführt wird. Dieser Ansatz führte jedoch bei der Ausführung über Go zu einem Syntaxfehler.

Der Fehler kann auf die Art und Weise zurückgeführt werden, wie die Abfrage aufgebaut ist. Insbesondere müssen die SET-Anweisungen in Klammern gekapselt und vor der SELECT-Anweisung platziert werden. Darüber hinaus sollte der MySQL-DSN die Einstellungen „multiStatements=true“ und „interpolateParams=true“ enthalten.

Der folgende aktualisierte Codeausschnitt behebt das Problem:

<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>

Durch Einschließen der SET-Anweisungen in Klammern und der Aktivierung von Mehrfachanweisungen und Parameterinterpolation im DSN wird die Abfrage in Go erfolgreich und ohne Syntaxfehler ausgeführt. Darüber hinaus werden durch die Konvertierung der Datenbank und Tabellen in die Sortierung utf8mb4_general_ci alle potenziellen Probleme im Zusammenhang mit der Zeichensatzkompatibilität behoben.

Das obige ist der detaillierte Inhalt vonWie behebe ich Syntaxfehler in Go für MySQL-Abfragen mithilfe von SET-Variablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn