Go基礎學習記錄 - 編寫Web應用程 - 資料庫(四)

來源:互聯網
上載者:User

本次分享下 -- 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有許多可用的資料庫驅動程式。以下是它們的三個例子

  1. https://github.com/lib/pq supports database/sql, written in pure Go.
  2. https://github.com/jbarham/go... supports database/sql, written in pure Go.
  3. 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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.