提要: 这个 PostgresQL Go 部分向您展示了如何使用 Go 编程语言来处理 PostgreSQL 数据库。

Go 有很多用于 PostgreSQL 的驱动。其中,最流行的是 lib/pg。它是使用纯 Go 语言开发的,完整实现 Go 语言 database/sql 规范的驱动。

安装 lib/pg

通过 go get 可以轻松安装 lib/pg

go get github.com/lib/pq

连接到 PostgreSQL

我们使用PHP接口部分的数据库和数据表进行演示。

首先,需要导入两个包:

import (
    "database/sql"

    _ "github.com/lib/pq"
)

有两种格式来书写 DSN:

"user=postgres dbname=sjk66 password=sjk66.com sslmode=disable"

"postgres://postgres:sjk66.com@localhost/sjk66?sslmode=disable"

常用参数如下:

参数 含义
dbname 数据库名
user 用户名
password 密码
host 主机
port 端口
sslmode SSL模式

sslmode 可选值

含义
disable 无SSL
require 总是启用SSL,跳过证书认证
verify-ca 总是启用SSL,使用CA证书进行认证
verify-full 总是启用SSL,使用CA证书进行认证,并且主机名必须与证书相匹配

我们新建一个 GetConn() 函数来连接数据库:

import (
    "database/sql"

    _ "github.com/lib/pq"
)

func GetConn() (*sql.DB, error){
    db, err := sql.Open("postgres://postgres:sjk66.com@localhost/sjk66?sslmode=disable")
    if err != nil {
        return nil, err
    }
    return db, nil
}

插入数据

func InsertStock(symbol, company string){
    db, err := GetConn()
    if err != nil {
        panic(err)
    }
    stmt, err := db.Prepare("INSERT INTO stocks(symbol,company) VALUES($1,$2)")
    if err != nil {
        panic(err)
    }
    stmt.Exec(symbol, company)
    stmt.Close()
    db.Close()
}

修改数据

func UpdateStock(id int, symbol, company string){
    db, err := GetConn()
    if err != nil {
        panic(err)
    }
    stmt, err := db.Prepare("UPDATE stocks SET company=$2, symbol=$1 WHERE id=$3")
    if err != nil {
        panic(err)
    }
    stmt.Exec(symbol, company, id)
    stmt.Close()
    db.Close()
}

删除记录

func delete(id int){
    sql := "DELETE FROM stocks  WHERE id=$1"
    db, err := GetConn()
    if err != nil {
        panic(err)
    }
    stmt, err := db.Prepare(sql)
    if err != nil {
        panic(err)
    }
    stmt.Exec(id)
    stmt.Close()
    db.Close()
}

查询记录

type SJK66StockItem struct {
    Id int,
    Symbol string,
    Company string
}
func FindAll() []*SJK66StockItem{
    sql := "SELECT * FROM stock"
    db, err := GetConn()
    if err != nil {
        panic(err)
    }
    rows, err := db.Query(sql)
    if err != nil {
        panic(err)
    }
    data := make([]*SJK66StockItem, 0);
    for rows.Next(){
        row := new(SJK66StockItem)
        rows.Scan(&row.Id, &row.Symbol, &row.Company)
        data = append(data, row)
    }
    rows.Close()
    db.Close()
    return data
}