99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

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

2022-05-13 17:47 更新

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

PostgreSQL和MySQL比較,它更加龐大一點(diǎn),因為它是用來替代Oracle而設(shè)計的。所以在企業(yè)應(yīng)用中采用PostgreSQL是一個明智的選擇。

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

驅(qū)動

Go實現(xiàn)的支持PostgreSQL的驅(qū)動也很多,因為國外很多人在開發(fā)中使用了這個數(shù)據(jù)庫。

在下面的示例中我采用了第一個驅(qū)動,因為它目前使用的人最多,在github上也比較活躍。

實例代碼

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

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);

看下面這個Go如何操作數(shù)據(jù)庫表數(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不支持這個函數(shù),因為他沒有類似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這種方式來指定要傳遞的參數(shù),而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也與MySQL的驅(qū)動中的dsn格式不一樣,所以在使用時請注意它們的差異。

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號