2017-10-13 7 views
0

Je suis en train de créer une nouvelle base de données MySQL:Création d'une nouvelle base de données MySQL avec Go en utilisant requête préparée

package main 

import (
    "database/sql" 
    "fmt" 
    "log" 

    _ "github.com/go-sql-driver/mysql" 
) 

func createDBIfNotExists() { 
    const (
     DB_NAME = "new_db" 
     DB_USER = "root" 
     DB_PASS = "777" 
     DB_HOST = "localhost" 
     DB_PORT = "3306" 
    ) 

    var dbUrl = fmt.Sprintf("%s:%[email protected](%s:%s)/", DB_USER, DB_PASS, DB_HOST, DB_PORT) 

    db, err := sql.Open("mysql", dbUrl) 
    defer db.Close() 
    handleError(err) 

    prepared, err := db.Prepare("CREATE DATABASE IF NOT EXISTS ?") 
    handleError(err) 

    _, err = prepared.Exec(DB_NAME) 
    handleError(err) 
} 

func main() { 
    createDBIfNotExists() 
} 

func handleError(err error) { 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

Mais ce code renvoie l'erreur:

2017/10/13 12:46:16 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 

Si j'ai changé ce code et concaténer nom DB à interroger:

prepared, err := db.Prepare("CREATE DATABASE IF NOT EXISTS " + DB_NAME) 
handleError(err) 
_, err = prepared.Exec() 

ce sera OK, mais je ne vais pas avoir une injection SQL potentielle.

Comment puis-je préparer et exécuter la création de DB?

Répondre

3

Vous ne pouvez pas. Les espaces réservés d'instruction préparée lient parameter values only, et non identifiers.

+0

Merci de votre réponse. Il ressemble à la concaténation la seule façon de résoudre ce problème, mais dans mon cas, DB_NAME est reçu de la variable d'environnement et je dois écrire le code de validation si je veux le concaténer – volodymyrkoval

+0

@volodymyrkoval: Correct. Vous devez fournir votre propre validation dans ce cas. – Flimzy