安装PostgresSQL
- 添加source
sudo vi /etc/apt/sources.list.d/pgdg.list
添加以下内容(zesty应根据不同版本代号更换):
deb http://apt.postgresql.org/pub/repos/apt/ zesty-pgdg main - 添加source key
wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add – - 更新并安装9.6
sudo apt update
apt-get install postgresql-9.6
sudo apt-get install postgresql-9.6
配置PostgreSQL并创建一个数据库
PostgreSQL安装完成后,系统中会创建一个叫做postgres的用户:
ethan@usb:~$ cat /etc/passwd | grep postgres
postgres:x:123:132:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
1. ROLE配置
我们开始通过createdb尝试创建一个数据库,将会得到错误信息:
ethan@usb:~$ createdb mydb
createdb: could not connect to database template1: FATAL: role “ethan” does not exist
PostgreSQL 9.5及以上版本通过角色(ROLE)来管理权限。默认情况下,只有postgres这一个ROLE可以创建数据库,我们可以通过su切换到postgres来进行各种操作,也可以将用户添加到ROLE中,但我并不喜欢这种方式,如有需要可以自行找文档。
所以我们可以先给postgres用户设置一个密码:
sudo passwd postgres
设置完密码后,通过su切换到该用户:
su postgres
2. 创建数据库
createdb testdb
3. 创建表
首先连接到数据库:
psql testdb
查看当前有哪些表:
select * from information_schema.tables;
创建一个SCHEMA:
CREATE SCHEMA IF NOT EXISTS snw;
在SCHEMA snw下创建一个表:
CREATE TABLE snw.contacts(
id CHAR(20),
name TEXT,
email TEXT
);
关于SCHEMA
SCHEMA相当于table的命名空间,不同SCHEMA中可以包含相同名字的table。此外,SCHEMA可以有一套自己的授权管理策略,从而控制所有子表的权限管理。
这并不是创建表必须的,但很有用!
插入值
INSERT INTO snw.contacts(name, email) VALUES
(‘Dr Nic Williams’, ‘drnic’),
(‘Brian Mattal’, ‘brain’),
(‘Wayne E. Seguin’, ‘wayneeseguin’),
(‘Long Nguyen’, ‘long’);
使用Go连接数据库
我们新创建的数据库中,也包含了ROLE权限管理。默认已经有一个叫做postgres的ROLE,但是它还没有设置密码,不能通过远程连接它。
通过psql testdb进入数据库,为该数据库的用户postgres设置一个密码:
ALTER ROLE postgres WITH ENCRYPTED PASSWORD ‘test_password’;
现在postgres的密码就是test_password,但仅限于这个叫做testdb的数据库,不会影响系统中的postgres用户。
使用go get 添加github.com/lib/pq 作为Go的postgres 驱动:
go get github.com/lib/pq
package main
import (
"database/sql"
_ "github.com/lib/pq"
"log"
"fmt"
)
func main() {
db, err := sql.Open("postgres", "postgres://postgres:test_password@localhost/testdb")
//db, err := sql.Open("postgres", "user=tester dbname=testdb")
if err != nil {
log.Fatal(err)
}
rows, err := db.Query("SELECT * FROM snw.contacts")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id string
var name string
var email string
if err := rows.Scan(&id, &name, &email); err != nil {
log.Fatal(err)
}
fmt.Printf("%s: %s Email: %s\n", id, name, email)
}
}
创建一个新的DB ROLE
CREATE ROLE gotester LOGIN ENCRYPTED PASSWORD ‘gotester_password’;
如果不指定LOGIN,那么使用该用户名密码连接数据库始终fail。
如果不指定PASSWORD,fail
这时如果通过这个用户名密码连接数据库,还会得到:
2017/10/01 09:06:16 pq: permission denied for schema snw
这就是SCHEMA的权限管理发挥作用了。可以将SCHEMA的owner转交给gotester:
ALTER SCHEMA snw OWNER TO gotester;
这时连接会出现:
2017/10/01 09:13:35 pq: permission denied for relation contacts
这时将snw.contacts也转交给gotester:
ALTER TABLE snw.contacts OWNER TO gotester;
一切OK。
在PostgreSQL中,postgres是SUPERUSER,根据权限最小的原则,最好使用具有较小权限的用户来进行各种操作。