在成功連上SQL資料庫後,
我們可以在一開始先寫好init()
初始化資料庫的連線。
var db *sql.DB
// 與DB連線。 init() 初始化,時間點比 main() 更早。
func init() {
dbConnect, err := sql.Open(
"mysql",
"root:root@tcp(127.0.0.1:3306)/",
)
if err != nil {
log.Fatalln(err)
}
err = dbConnect.Ping()
if err != nil {
log.Fatalln(err)
}
db = dbConnect // 用全域變數接
db.SetMaxOpenConns(10) // 可設置最大DB連線數,設<=0則無上限(連線分成 in-Use正在執行任務 及 idle執行完成後的閒置 兩種)
db.SetMaxIdleConns(10) // 設置最大idle閒置連線數。
// 更多用法可以 進 sql.DBStats{}、sql.DB{} 裡面看
}
Golang中的*sql.DB
這一物件抽了一層介面出來,
日後等子孫們不想使用MySQL
時,
只需更換 driver 即可。
若在使用上時出現 Error 1046 no database selected
的錯誤,
表示沒有指定資料庫,可改成以下指定該資料庫來連線。
db, err := sql.Open(
"mysql",
"root:root@tcp(127.0.0.1:3306)/dbName",
)
或者用SQL語法的USE
來指定資料庫。
db.Exec("USE `school`")
下SQL語法關鍵字
時,通常會使用全大寫
(雖然小寫也可以,但大寫較容易區分)
db.Exec("CREATE DATABASE `test1`")
加了IF NOT EXISTS
之後,會先檢查要建立的物件存不存在,如果不存在再執行建立。
否則 如果無法建立物件時(未成功執行),err
會回傳 Error 1007: Can't create database '..'; database exists
。
_, err := db.Exec("CREATE DATABASE IF NOT EXISTS `test1`")
同樣能先判斷IF EXISTS
看欲刪除的物件存不存在。
db.Exec("DROP DATABASE IF EXISTS `test1`")
此外,SQL語法可以用變數代入、拉出來寫成一個func
func main() {
createDb("`school`") // 比較好的習慣會使用 `` 反引號(重音號)來區隔名字
// deleteDb("`school`")
}
func createDb(dbName string) {
_, err := db.Exec("CREATE DATABASE IF NOT EXISTS " + dbName + ";")
if err != nil {
log.Fatalln(err)
}
fmt.Print(err)
}
func deleteDb(dbName string) {
_, err := db.Exec("DROP DATABASE IF EXISTS " + dbName + ";")
if err != nil {
log.Fatalln(err)
}
}
新增MySQL
輸入帳號與密碼
切換到Scheme頁面
資料表中每個欄位都必須要有類型、並設置Byte長度,才能存放該型別的資料。
常見的變數類型有:
INT
(每長度 4 bytes): 數字,存放整數資料CHAR
(每長度 1 byte): 固定長度字串VARCHAR
: 可變長度字串,用多少長度就多少TEXT
: 文字敘述、說明(長度較長)DATE
: 時間格式TIMESTAMP
: 時間戳建立student的表格
func createTable1() {
// SQL: CREATE TABLE IF NOT EXISTS `school.student`
// 初始化Table 沒給任何欄位時,會出現 `A table must have at least 1 column` 的錯誤
_, err := db.Exec("CREATE TABLE IF NOT EXISTS `school`.`student`(`name` VARCHAR (10))")
if err != nil {
log.Fatalln(err)
}
// 或者用 USE 來指定該資料庫
// db.Exec("USE `school`")
// _, err := db.Exec("CREATE TABLE IF NOT EXISTS `student`(`name` VARCHAR (10))")
}
再建立一個teacher的表格,這次存放name(VARCHAR)
、age(INT)
兩個欄位,
並且設置name為PRIMARY KEY
(唯一不重複的識別ID)。
表單目前內是沒任何內容的。
_, err := db.Exec("CREATE TABLE IF NOT EXISTS `school`.`teacher`(`name` VARCHAR (10) PRIMARY KEY, `age` INT (1))")
_, err := db.Exec("DROP TABLE IF EXISTS `school`.`student`")
替 student的Table加上 id
這個會自動遞增(AUTO_INCREMENT)的欄位,並設定成主鍵(數字遞增的特性:唯一、不重複,且Not Null)。
_, err := db.Exec("ALTER TABLE `school`.`student` ADD `id` INT AUTO_INCREMENT PRIMARY KEY;")
資料表、欄位
會用反引號` ` 包起來,以防與SQL語法關鍵字搞混。
而雙引號" "常用在字串的組合、組成SQL語法傳遞給資料庫。