du8828 2017-10-13 10:01
浏览 48
已采纳

使用准备好的查询使用Go创建新的MySQL数据库

I am trying to create new MySQL database:

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:%s@tcp(%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)
    }
}

But this code returns error:

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

If I changed this code and concatenate DB name to query:

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

it will be OK, but i don't wont to have potential SQL injection.

How i can prepare and execute creation of DB?

  • 写回答

1条回答 默认 最新

  • duancheng6221 2017-10-13 10:16
    关注

    You can't. Prepared statement placeholders bind parameter values only, not identifiers.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100