Back
Featured image of post Postgres 初见

Postgres 初见

 

转自阮一峰老师PostgreSQL新手入门,有微调并增加了 Docker 部署的部分内容

自从 MySQL 被 Oracle 收购以后,PostgreSQL 逐渐成为开源关系型数据库的首选。

本文介绍 PostgreSQL 的安装和基本用法,供初次使用者上手。以下内容基于 Debian 操作系统,其他操作系统实在没有精力兼顾,但是大部分内容应该普遍适用。

一、安装

直接安装

首先,安装 PostgreSQL 客户端。

sudo apt-get install postgresql-client

然后,安装 PostgreSQL 服务器。

sudo apt-get install postgresql

正常情况下,安装完成后,PostgreSQL 服务器会自动在本机的 5432 端口开启。

如果还想安装图形管理界面,可以运行下面命令,但是本文不涉及这方面内容。

sudo apt-get install pgadmin3

使用 Docker

Docker 使用就比较简单了,主要是需要创建 Docker 卷并将容器中的数据文件夹映射到宿主机中,否则每次启动 Docker 都会将所有的数据清空。

首先创建一个数据卷

docker volume create <宿主机中的卷名>

启动 PostgreSQL 容器

docker run -d \
    --name <postgresql容器名称> \
    -p 5432:5432 \
    -e POSTGRES_USER=<数据库用户名>
    -e POSTGRES_PASSWORD=<数据库访问密码> \
    -v <宿主机卷名>:/var/lib/postgresql/data \
    postgres:latest

上面的命令逐条代表:

  1. 运行一个 Docker 容器,-d 表示在后台运行;
  2. 定义此容器的名称,后续对于容器的一些操作都可用该名称进行;
  3. 将容器的 5432 端口映射到宿主机的 5432 端口,注意这里前面是宿主机端口,后面是容器内端口;
  4. 设置此容器的 PostgreSQL 用户名,如不传此环境变量默认创建用户名为 postgres
  5. 为此用户创建数据库访问密码;
  6. 将刚才创建的宿主机 Docker 数据卷映射进容器的 /var/lib/postgresql/data 目录,这句话就是保证每次重启 Docker 容器数据不丢失的关键,此时数据都存在宿主机内,Docker 的升级、重启等都不影响数据库的数据;
  7. 运行 Postgres 容器的 latest 版本,因为此镜像是 Docker 官方维护,如果是其他人的镜像可能需要添加 xxx/postgres 之类。

二、添加新用户和新数据库

初次安装后,默认生成一个名为 postgres 的数据库和一个名为 postgres 的数据库用户(如果是上面的 Docker 安装且指定了用户名,则为该用户名)。

这里需要注意的是,同时还生成了一个名为 postgres 的 Linux 系统用户。

下面,我们使用 postgres 用户,来生成其他用户和新数据库。好几种方法可以达到这个目的,这里介绍两种。

第一种方法,使用 PostgreSQL 控制台。

首先,新建一个 Linux 新用户,可以取你想要的名字,这里为 dbuser。

sudo adduser dbuser

然后,切换到 postgres 用户。

sudo su postgres

下一步,使用 psql 命令登录 PostgreSQL 控制台。

psql

这里需要注意,如果是使用上面的 Docker 方法安装,需要进入容器的 bash 执行,首先:

docker exec -it <你的容器名> bash

进入之后就可以使用 psql 进入数据库命令行了。

这时相当于系统用户 postgres 以同名数据库用户的身份,登录数据库,这是不用输入密码的。如果一切正常,系统提示符会变为 postgres=#,表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。

如果想要指定用户登陆,则需要添加参数:

psql -U <用户名>

进入之后,如果没有设置密码,第一件事是使用 \password 命令,为 postgres 用户设置一个密码。

\password postgres

第二件事是创建数据库用户 dbuser(刚才创建的是 Linux 系统用户),并设置密码。

CREATE USER dbuser WITH PASSWORD 'password';

第三件事是创建用户数据库,这里为 exampledb,并指定所有者为 dbuser。

CREATE DATABASE exampledb OWNER dbuser;

第四件事是将 exampledb 数据库的所有权限都赋予 dbuser,否则 dbuser 只能登录控制台,没有任何数据库操作权限。

GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;

最后,使用 \q 命令退出控制台(也可以直接按 ctrl+D)。

\q

第二种方法,使用 shell 命令行

添加新用户和新数据库,除了在 PostgreSQL 控制台内,还可以在 shell 命令行下完成。这是因为 PostgreSQL 提供了命令行程序 createusercreatedb。还是以新建用户 dbuser 和数据库 exampledb 为例。

首先,创建数据库用户 dbuser,并指定其为超级用户。

sudo -u postgres createuser --superuser dbuser

然后,登录数据库控制台,设置 dbuser 用户的密码,完成后退出控制台。

sudo -u postgres psql
\password dbuser
\q

接着,在 shell 命令行下,创建数据库 exampledb,并指定所有者为 dbuser。

sudo -u postgres createdb -O dbuser exampledb

三、登录数据库

添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时使用的是 psql 命令。

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432

上面命令的参数含义如下:-U 指定用户,-d 指定数据库,-h 指定服务器,-p 指定端口。

输入上面命令以后,系统会提示输入 dbuser 用户的密码。输入正确,就可以登录控制台了。

psql 命令存在简写形式。如果当前 Linux 系统用户,同时也是 PostgreSQL 用户,则可以省略用户名(-U 参数的部分)。举例来说,我的 Linux 系统用户名为 ruanyf ,且 PostgreSQL 数据库存在同名用户,则我以 ruanyf 身份登录 Linux 系统后,可以直接使用下面的命令登录数据库,且不需要密码。

psql exampledb

此时,如果 PostgreSQL 内部还存在与当前系统用户同名的数据库,则连数据库名都可以省略。比如,假定存在一个叫做 ruanyf 的数据库,则直接键入 psql 就可以登录该数据库。

psql

另外,如果要恢复外部数据,可以使用下面的命令,即导入 sql

psql exampledb < exampledb.sql

四、控制台命令

除了前面已经用到的 \password 命令(设置密码)和 \q 命令(退出)以外,控制台还提供一系列其他命令。

  • \h:查看 SQL 命令的解释,比如 \h select
  • \?:查看 psql 命令列表。
  • \l:列出所有数据库。
  • \c [database_name]:连接其他数据库。
  • \d:列出当前数据库的所有表格。
  • \d [table_name]:列出某一张表格的结构。
  • \du:列出所有用户。
  • \e:打开文本编辑器。
  • \conninfo:列出当前数据库和连接的信息。

五、数据库操作

基本的数据库操作,就是使用一般的 SQL 语言。

  • 创建新表

    CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
    
  • 插入数据

    INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');
    
  • 选择记录

    SELECT * FROM user_tbl;
    
  • 更新数据

    UPDATE user_tbl set name = '李四' WHERE name = '张三';
    
  • 删除记录

    DELETE FROM user_tbl WHERE name = '李四';
    
  • 添加栏位

    ALTER TABLE user_tbl ADD email VARCHAR(40);
    
  • 更新结构

    ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
    
  • 更名栏位

    ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
    
  • 删除栏位

    ALTER TABLE user_tbl DROP COLUMN email;
    
  • 表格更名

    ALTER TABLE user_tbl RENAME TO backup_tbl;
    
  • 删除表格

    DROP TABLE IF EXISTS backup_tbl;