Maison > développement back-end > Golang > le corps du texte

Pouvez-vous exécuter des requêtes MySQL avec des variables SET lorsque vous utilisez la méthode Query() de Go ?

Susan Sarandon
Libérer: 2024-10-24 02:37:02
original
352 Les gens l'ont consulté

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

Requêtes MySQL avec des variables SET dans Go

Arrière-plan :

L'utilisateur tente de exécutez une requête MySQL complexe à l'aide de Go qui implique la définition de variables utilisateur avant d'exécuter la requête. La requête s'exécute avec succès à partir de la console, mais elle échoue avec une erreur de syntaxe lorsqu'elle est exécutée via Go. L'utilisateur s'interroge sur la possibilité d'utiliser des variables SET avec la méthode Query() de Go.

Solution :

Le problème de l'utilisateur a été résolu en apportant les modifications suivantes :

  1. Configuration DSN :

    • Ajout de ?multiStatements=true&interpolateParams=true au DSN utilisé lors de la connexion à la base de données. Cela permet l'exécution de plusieurs instructions en un seul appel et permet l'interpolation des paramètres.
  2. Conversion de base de données et de table :

    • Conversion de la base de données et des tables pertinentes en classement utf8mb4_general_ci. Cela a résolu une erreur liée à une incompatibilité de classement.

Code :

Avec ces modifications, le code fourni par l'utilisateur devrait fonctionner comme prévu :

<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>
Copier après la connexion

En modifiant la configuration DSN et en convertissant la base de données et les tables dans le classement approprié, l'utilisateur peut exécuter avec succès la requête en question tout en évitant l'erreur de syntaxe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!