Go 使用PostgreSQL數(shù)據(jù)庫(kù)

2022-05-13 17:47 更新

PostgreSQL 是一個(gè)自由的對(duì)象-關(guān)系數(shù)據(jù)庫(kù)服務(wù)器(數(shù)據(jù)庫(kù)管理系統(tǒng)),它在靈活的 BSD-風(fēng)格許可證下發(fā)行。它提供了相對(duì)其他開放源代碼數(shù)據(jù)庫(kù)系統(tǒng)(比如 MySQL 和 Firebird),和對(duì)專有系統(tǒng)比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server的一種選擇。

PostgreSQL和MySQL比較,它更加龐大一點(diǎn),因?yàn)樗怯脕?lái)替代Oracle而設(shè)計(jì)的。所以在企業(yè)應(yīng)用中采用PostgreSQL是一個(gè)明智的選擇。

MySQL被Oracle收購(gòu)之后正在逐步的封閉(自MySQL 5.5.31以后的所有版本將不再遵循GPL協(xié)議),鑒于此,將來(lái)我們也許會(huì)選擇PostgreSQL而不是MySQL作為項(xiàng)目的后端數(shù)據(jù)庫(kù)。

驅(qū)動(dòng)

Go實(shí)現(xiàn)的支持PostgreSQL的驅(qū)動(dòng)也很多,因?yàn)閲?guó)外很多人在開發(fā)中使用了這個(gè)數(shù)據(jù)庫(kù)。

在下面的示例中我采用了第一個(gè)驅(qū)動(dòng),因?yàn)樗壳笆褂玫娜俗疃?,在github上也比較活躍。

實(shí)例代碼

數(shù)據(jù)庫(kù)建表語(yǔ)句:

CREATE TABLE userinfo
(
    uid serial NOT NULL,
    username character varying(100) NOT NULL,
    departname character varying(500) NOT NULL,
    Created date,
    CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
)
WITH (OIDS=FALSE);

CREATE TABLE userdeatail
(
    uid integer,
    intro character varying(100),
    profile character varying(100)
)
WITH(OIDS=FALSE);

看下面這個(gè)Go如何操作數(shù)據(jù)庫(kù)表數(shù)據(jù):增刪改查

package main

import (
    "database/sql"
    "fmt"
    _ "https://github.com/lib/pq"
)

func main() {
    db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")
    checkErr(err)

    //插入數(shù)據(jù)
    stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")
    checkErr(err)

    res, err := stmt.Exec("astaxie", "研發(fā)部門", "2012-12-09")
    checkErr(err)

    //pg不支持這個(gè)函數(shù),因?yàn)樗麤]有類似MySQL的自增ID
    id, err := res.LastInsertId()
    checkErr(err)

    fmt.Println(id)

    //更新數(shù)據(jù)
    stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")
    checkErr(err)

    res, err = stmt.Exec("astaxieupdate", 1)
    checkErr(err)

    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    //查詢數(shù)據(jù)
    rows, err := db.Query("SELECT * FROM userinfo")
    checkErr(err)

    for rows.Next() {
        var uid int
        var username string
        var department string
        var created string
        err = rows.Scan(&uid, &username, &department, &created)
        checkErr(err)
        fmt.Println(uid)
        fmt.Println(username)
        fmt.Println(department)
        fmt.Println(created)
    }

    //刪除數(shù)據(jù)
    stmt, err = db.Prepare("delete from userinfo where uid=$1")
    checkErr(err)

    res, err = stmt.Exec(1)
    checkErr(err)

    affect, err = res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    db.Close()

}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

從上面的代碼我們可以看到,PostgreSQL是通過$1,$2這種方式來(lái)指定要傳遞的參數(shù),而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也與MySQL的驅(qū)動(dòng)中的dsn格式不一樣,所以在使用時(shí)請(qǐng)注意它們的差異。

還有pg不支持LastInsertId函數(shù),因?yàn)镻ostgreSQL內(nèi)部沒有實(shí)現(xiàn)類似MySQL的自增ID返回,其他的代碼幾乎是一模一樣。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)