生命不止,繼續 Go go go !!!
之前關于golang操作數據庫的博客:
Go實戰–Go語言操作MySQL數據庫(go-sql-driver/mysql)
Go實戰–go語言操作sqlite數據庫(The way to go)
Go實戰–golang中使用MongoDB(mgo)
Go實戰–golang中使用redis(redigo和go-redis/redis)
今天跟大家分享golang中使用PostgreSQL數據庫。
何為PostgreSQL
官網
https://www.postgresql.org/
PostgreSQL is a powerful, open source object-relational database system.
PostgreSQL是一個功能強大的開源對象關系數據庫管理系統(ORDBMS)。 用于安全地存儲數據; 支持最佳做法,并允許在處理請求時檢索它們。
特點
- PostgreSQL可在所有主要操作系統(即linux,UNIX(AIX,BSD,HP-UX,SGI IRIX,mac OS X,Solaris,Tru64)和windows等)上運行
- PostgreSQL支持文本,圖像,聲音和視頻,并包括用于C/C++,JAVA,Perl,Python,Ruby,Tcl和開放數據庫連接(ODBC)的編程接口
- PostgreSQL支持SQL的許多功能,例如復雜SQL查詢,SQL子選擇,外鍵,觸發器,視圖,事務,多進程并發控制(MVCC),流式復制(9.0),熱備(9.0))
- 在PostgreSQL中,表可以設置為從“父”表繼承其特征
- 可以安裝多個擴展以向PostgreSQL添加附加功能
PostgreSQL 與 MySQL 相比,優勢何在?
知乎上有大神們的討論,可以看一看:https://www.zhihu.com/question/20010554
Windows下安裝PostgreSQL
下載
https://www.postgresql.org/download/windows/
跳轉到https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows
根據自己的操作系統下載,例如我選擇:
PostgreSQL 9.6.4
Windows x86-64
下載速度不是很快,稍安勿躁。
安裝
下一步,選擇安裝文件夾,選擇數據所在位置,填寫密碼,端口號,選擇運行時語言環境等。
默默等待安裝。
使用pgAdmin
打開pgAdmin,要輸入之前設置的密碼
創建數據庫
在Databases(1)上右鍵,Create, Database
刪除數據庫
創建表
插入數據
使用SQL Shell(psql)
創建數據庫
create database name;
刪除數據庫
drop database name;
如果出現錯誤的話,請先斷開其他對該數據庫的連接。
創建表
CREATE TABLE public.student
(
id integer,
name character(1)[] COLLATE pg_catalog."default"
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.student
OWNER to postgres;
插入數據
INSERT INTO public.teacher(
id, age)
VALUES (2, 34);
查詢
SELECT * FROM public.teacher;
Go中使用PostgreSQL
github.com/lib/pq
Pure Go Postgres driver for database/sql
連接
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
host = "localhost"
port = 5432
user = "postgres"
password = "your_password"
dbname = "test"
)
func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("Successfully connected!")
}
插入
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
host = "localhost"
port = 5432
user = "postgres"
password = "wangshubo123"
dbname = "test"
)
type Teacher struct {
ID int
Age int
}
func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("Successfully connected!")
sqlStatement := `
INSERT INTO teacher (id, age)
VALUES ($1, $2)
RETURNING id`
id := 3
err = db.QueryRow(sqlStatement, 3, 19).Scan(&id)
if err != nil {
panic(err)
}
fmt.Println("New record ID is:", id)
}
再運行一次,錯誤:panic: pq: 重復鍵違反唯一約束”teacher_pkey”
查詢
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
host = "localhost"
port = 5432
user = "postgres"
password = "wangshubo123"
dbname = "test"
)
type Teacher struct {
ID int
Age int
}
func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("Successfully connected!")
sqlStatement := `SELECT * FROM teacher WHERE id=$1;`
var teacher Teacher
row := db.QueryRow(sqlStatement, 1)
err = row.Scan(&teacher.ID, &teacher.Age)
switch err {
case sql.ErrNoRows:
fmt.Println("No rows were returned!")
return
case nil:
fmt.Println(teacher)
default:
panic(err)
}
}