# Day26 Golang MySQL安裝 資料庫的幻想與介紹 > 想當年,還沒學資料庫之前,對未知的**資料庫**一詞這充滿了憧憬與想像, > 覺得這就是塞了一堆資料的地方,但不曉得原理是怎麼塞的, > 可能是用了外星科技或各種黑魔法吧。 > 直到上了資料庫的課,老師打破了我對資料庫的幻想。 > 順帶一提,過了一個學期之後,那位老師開始教作業系統, > 再度破滅了原先我對**作業系統**異想天開的構想。 > 但老師實在是教的很棒,真是愛恨交加。 `資料庫(Database)`分成非常多種: * 星狀資料庫 * 關聯式資料庫 * 階層式資料庫 * 物件導向資料庫 * ... 但最常用到的是`關聯式資料庫(Relational Database)`簡稱RDB,以及`非關聯式資料庫(NoSQL)`(NOSQL不是沒有SQL,也不是對SQL說`NO`,而指的是`Not Only SQL`) ## DB、SQL、RDBMS 的關係 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 是一個系統、一項服務。 要跑起服務前,當然需要在電腦上下載與安裝。 安裝方法多到數不清。 MySQL目前出到8.0版本了。 以下會統一把最高權限帳戶root的密碼改成`root` #### Windows 除了可以下載 [**MySQL官網**](https://dev.mysql.com/downloads/installer/) 來安裝, 也可以下載簡單好用的 [**XAMPP**](https://www.apachefriends.org/zh_tw/download.html) 來啟動MySQL服務, #### XAMPP (Windows)  XAMPP的MySQL預設密碼為空, 點擊`Shell`,將root帳號的密碼為`root` $ mysqladmin.exe -u root password root 這裡也要做更改   如果日後會用到`phpmyadmin`介面的話,這邊也要改做修改   接著重啟MySQL服務。 #### MacOS 用`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 也可以用跨平台的`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-MySQL-Driver]https://github.com/go-sql-driver/mysql $ go get -u github.com/go-sql-driver/mysql 連線MySQL的第一支程式。 以下運行成功的話不會出現任何東西。 ```go 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, call `Ping()`. 沒開啟服務、沒連接到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?)`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up