想當年,還沒學資料庫之前,對未知的資料庫一詞這充滿了憧憬與想像,
覺得這就是塞了一堆資料的地方,但不曉得原理是怎麼塞的,
可能是用了外星科技或各種黑魔法吧。
直到上了資料庫的課,老師打破了我對資料庫的幻想。
順帶一提,過了一個學期之後,那位老師開始教作業系統,
再度破滅了原先我對作業系統異想天開的構想。
但老師實在是教的很棒,真是愛恨交加。
資料庫(Database)
分成非常多種:
但最常用到的是關聯式資料庫(Relational Database)
簡稱RDB,以及非關聯式資料庫(NoSQL)
(NOSQL不是沒有SQL,也不是對SQL說NO
,而指的是Not Only SQL
)
DB 是資料庫,是一群數據的集合體,數據所在的位置,不管存了什麼都叫資料庫。
(DBA 是資料庫管理員,負責資料庫的維護、備份、安全管理的人。)
SQL 是結構化查詢語言,是一種程式語言,語法關鍵字有SELECT
、INSERT
、WHERE
、DROP
等等,用來操作關聯式資料庫。
RDBMS 是關聯式資料庫管理系統,是實作出來可以支援SQL語法的系統、服務,如MySQL
、SQLite
、MariaDB
、Oracle Database
、Access
等等。
NoSQL 是相對於RDBMS的 非關聯式資料庫管理系統,也有非常眾多的系統,如Redis
、memcached
、MongoDB
等等,其中有支援鍵值(Key–value)
的、也有支援JSON格式
的。
關聯式資料庫基本上就是Microsoft Office 的 Excel
,都是二維的表格,都有行列欄位。
只不過用法更加的靈活,可以設置 唯一識別 主鍵(Primary Key)
, 不可重複 Unique
等等條件。
MySQL 是一個系統、一項服務。
要跑起服務前,當然需要在電腦上下載與安裝。
安裝方法多到數不清。
MySQL目前出到8.0版本了。
以下會統一把最高權限帳戶root的密碼改成root
除了可以下載 MySQL官網 來安裝,
也可以下載簡單好用的 XAMPP 來啟動MySQL服務,
XAMPP的MySQL預設密碼為空,
點擊Shell
,將root帳號的密碼為root
$ mysqladmin.exe -u root password root
這裡也要做更改
如果日後會用到phpmyadmin
介面的話,這邊也要改做修改
接著重啟MySQL服務。
用Homebrew
來安裝執行
$ brew install mysql@8.0
$ brew services start mysql@8.0
更改root密碼
$ /usr/local/bin/mysqladmin -u root password root
登入MySQL
$ mysql -u root -p
(要結束MySQL的話)
$ brew services stop mysql@8.0
也可以用跨平台的Docker Container
方式:
把container命名為mysql_test
將密碼預設為root
$ docker run --name=mysql_test -d -p 3306:3306 --env MYSQL_ROOT_PASSWORD=root mysql:8.0
登入MySQL
$ docker exec -it mysql_test mysql -uroot -p
(要結束MySQL的話)
$ docker container rm -f mysql_test
MySQL服務預設會開在Server端的3306 Port
。
而Server端儲存的root密碼是root,
Client端連進去的密碼就要是root,否則無法登入。
安裝完成、也確認過可以用帳號密碼root/root登入後,便可以開始來寫程式。
在這邊Server端
跟Client端
指的都是自己目前的電腦。
接下來會以程式的方式來模擬Client端,Client端能對Server端進行登入、操作資料等等。
但在用Golang 模擬 Client端的行為之前,要先安裝驅動Driver,否則不能支援地
$ go get -u github.com/go-sql-driver/mysql
連線MySQL的第一支程式。
以下運行成功的話不會出現任何東西。
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" //為什麼要用底線_來占著位子?
"log"
)
func main() {
dbConnect, err := sql.Open(
"mysql", // 因為只有這裡才用到這個`引數`,並沒有直接使用到了mysql.XXX 相關的函式或物件,會被認為沒有用到mysql這個依賴而 被go編譯器省略import
"root:root@tcp(127.0.0.1:3306)/",
)
if err != nil {
log.Fatalln(err)
}
err = dbConnect.Ping() //Ping() 這裡才開始建立連線。上面 sql.Open 只建立物件、容器,並未進行連線,無法連線並不造成err。
if err != nil {
log.Fatalln(err)
}
}
Open()
may just validate its arguments without creating a connection to the database.
To verify that the data source name is valid, callPing()
.
沒開啟服務、沒連接到MySQL的話會出現:dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine actively refused it.
密碼錯誤會出現:Error 1045: Access denied for user 'root'@'localhost' (using password: YES)
沒有import Driver:sql: unknown driver "mysql" (forgotten import?)