本次分享下 -- PostgreSQL資料庫驅動程式
為了保持項目的可學習性,我這裡將之前分享的代碼積累了下,放在github上,想要儘快入手學習的,可以直接cloneMy Code,寫代碼不上手,都等於白搭,光看的話,對於我來說,我是不行的,沒辦法學會。
項目地址
https://github.com/durban89/wiki_blogtag: 1.0.10
有些同學可能看不懂,怎麼就只給了這些,完全不懂呀。我把使用的命令打出來,照著操作,就應該可以解決了
git clone https://github.com/durban89/wiki_blog /local/pathcd /local/pathgit fetch origingit checkout 1.0.10
這些我覺得 夠清晰了。OK!
繼續分享"資料庫"的分享。
資料庫
對於Web開發人員而言,資料庫是Web開發的核心。
您幾乎可以將任何內容儲存到資料庫中,並查詢或更新其中的資料,如使用者資訊,產品或新聞文章。
Go不提供任何資料庫驅動程式,但它確實在database/sql包中定義了驅動程式介面。
我們可以基於該介面開發資料庫驅動程式。首先先看下 “PostgreSQL資料庫驅動程式”
PostgreSQL
PostgreSQL是一個對象關聯式資料庫管理系統,可用於許多平台,包括Linux,FreeBSD,Solaris,Microsoft Windows和Mac OS X.它是在MIT風格的許可下發布的,因此是免費的開源軟體。
它比MySQL大,因為它是為企業用作Oracle的替代品而設計的。
Postgresql是企業類項目的不錯選擇。
PostgreSQL drivers
PostgreSQL有許多可用的資料庫驅動程式。以下是它們的三個例子
- https://github.com/lib/pq supports database/sql, written in pure Go.
- https://github.com/jbarham/go... supports database/sql, written in pure Go.
- https://github.com/lxn/go-pgsql supports database/sql, written in pure Go.
我將使用後面樣本中的第一個。
Samples 執行個體示範
安裝PostgreSQL驅動
如果本地沒有安裝的話,先去安裝下這個包,安裝命令如下
go get https://github.com/lib/pq
添加PostgreSQL驅動串連
項目目錄下建立一個檔案夾db,db中建立一個檔案pg.go,檔案內容如下
package dbimport ( "database/sql" "fmt" // Register PostgreSQL _ "github.com/lib/pq")const ( // DBUser 使用者名稱 DBUser = "root" // DBPassword 密碼 DBPassword = "123456" // DBName 庫名 DBName = "test")// PostgreSQLDB Connvar PostgreSQLDB *sql.DBfunc init() { dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable", DBUser, DBPassword, DBName) db, err := sql.Open("postgres", dbinfo) PostgreSQLDB = db checkPostgreSQLErr(err)}func checkPostgreSQLErr(err error) { if err != nil { panic(err) }}
由於我是初學者,一些大膽的嘗試,可能存在規範上或者架構上的問題,還請多多指教。
我這裡之所以這樣建立,本著代碼分離的原則,不希望在每個使用資料庫的地方都重複寫一邊代碼,這裡會不會存在重複建立串連,導致記憶體崩潰還有待繼續深入學習。
好了,廢話不多說了,這裡建立了一個PostgreSQLDBB,首先說下init這個函數的作用
init函數是用於程式執行前做包的初始化的函數,比如初始化包裡的變數等
也就是所每次使用PostgreSQLDB的時候都會去串連下資料庫
這就說明了,每次使用PostgreSQLDB的時候,PostgreSQLDB都是一個串連了的,方便後面的調用。
建立model
由於以前都是寫PHP的,大多數使用的也都是MVC,所以我這裡在項目目錄下建立了一個models檔案夾,然後建立一個blog.go檔案,裡面的代碼如下
package modelsimport ( "database/sql" "github.com/durban89/wiki/db")// Conn 串連var Conn *sql.DBfunc init() { // MySQL // Conn = db.DB // SQLite // Conn = db.SQLiteDB // PostgreSQL Conn = db.PostgreSQLDB}// Query 擷取一條資料func Query() ([]string, error) { rows, err := Conn.Query("SELECT * FROM blog") if err != nil { return nil, err } var res = []string{} for rows.Next() { var autokid int var title string err = rows.Scan(&autokid, &title) if err != nil { return nil, err } res = append(res, title) } return res, nil}
資料庫建立
建立資料庫blog
CREATE TABLE blog ( autokid SERIAL PRIMARY KEY, title VARCHAR(100));
添加測試資料
INSERT INTO blog(title) VALUES('title1');INSERT INTO blog(title) VALUES('title2');INSERT INTO blog(title) VALUES('title3');
單元測試
下面建立測試單元,測試下我們的Query函數是否能擷取到資料,建立blog_test.go檔案(如果不存在),跟blog.go檔案放在一起,代碼內容如下
package modelsimport ( "testing")// TestQuery 測試擷取資料func TestQuery(t *testing.T) { row, err := Query() if err != nil { t.Error(err) } else { t.Log(row) } if len(row) > 0 { t.Log("正確") } for i, k := range row { t.Log(i) t.Log(k) }}
當我們在models目錄下進行測試的時候,會得到如下輸出,說明我們的功能是正常的
$ go testPASSok github.com/durban89/wiki/models 0.023s
請注意,PostgreSQL使用$1,$2格式而不是MySQL使用的?,它在sql.Open中有不同的DSN格式。另一件事是PostgreSQL驅動程式不支援sql.Result.LastInsertId()。所以不是這樣,
// Create 添加一條記錄func Create(title string) { var lastInsertID int err := PostgreSQLDB.QueryRow("INSERT INTO blog(title) VALUES($1) returning autokid;", title).Scan(&lastInsertID) checkPostgreSQLErr(err) fmt.Println("last inserted id =", lastInsertID)}
使用db.QueryRow()和.Scan()來擷取最後插入的id的值。
今天就分享到這裡,如果你有其他疑問請在下方留言或者加群交流
項目更新地址
https://github.com/durban89/typescript_demo.gittag: 1.0.11