Maison > développement back-end > Golang > Comment utiliser les variables SET dans les requêtes Go MySQL ?

Comment utiliser les variables SET dans les requêtes Go MySQL ?

Patricia Arquette
Libérer: 2024-10-23 17:49:02
original
491 Les gens l'ont consulté

How to Use SET Variables in Go MySQL Queries?

Utilisation de requêtes Go MySQL avec des variables SET

Vous essayez d'écrire une requête Go MySQL qui définit des variables et les utilise de manière complexe Clause ORDER BY. La requête s'exécute avec succès dans la console mais rencontre une erreur de syntaxe dans Go.

Solution possible

Malheureusement, le package base de données/sql de Go ne prend actuellement pas en charge la configuration des utilisateurs MySQL. variables définies. Par conséquent, l'approche décrite dans la question n'est pas réalisable avec les limitations actuelles du package.

Approches alternatives

Génération de requêtes dynamiques :

Une alternative consiste à générer dynamiquement la clause ORDER BY en fonction des paramètres d'entrée, éliminant ainsi le besoin de substitution de variable.

<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) {
    query := `
    SELECT
        *
    FROM
        inventory
    WHERE
        user_id = ?
    ORDER BY
        ` + generateOrderBy(srt) + `
    LIMIT ?,?;
    `

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

    // ... (rest of the code remains the same)

    return result, nil
}

func generateOrderBy(srt string) string {
    order := ""
    switch srt {
    case "type,asc":
        order = "`type` ASC"
    case "type,desc":
        order = "`type` DESC"
    // ... (add other cases)
    }
    return order
}</code>
Copier après la connexion

Extension des paramètres :

Vous pouvez également développer manuellement le ? des espaces réservés dans la chaîne de requête pour éviter le besoin de variables. Cette approche consiste à construire une chaîne qui remplace chaque ? avec la valeur du paramètre correspondante.

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

    rows, err := d.Query(
        query,
    )

    // ... (rest of the code remains the same)

    return result, nil
}</code>
Copier après la connexion

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