Postgresql on Ubuntu zesty: 从安装到使用Go连接数据库

安装PostgresSQL

  1. 添加source
    sudo vi /etc/apt/sources.list.d/pgdg.list
    添加以下内容(zesty应根据不同版本代号更换):
    deb http://apt.postgresql.org/pub/repos/apt/ zesty-pgdg main
  2. 添加source key
    wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –
  3. 更新并安装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,根据权限最小的原则,最好使用具有较小权限的用户来进行各种操作。

    原文作者:吃土的汉子
    原文地址: https://www.jianshu.com/p/b51561466110
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞