作为传统开源数据库的坚定支持者,PostgreSQL在数据库领域中一直有不错的名声,在TOP DB index指数中也基本上是在第五的位置。由于考虑到Oracle、MySQL和SQL Server常年居于前三,加之Microsoft Access借助Office的背景也一直有不错的背景,第五的位置的争夺其实才是相对有看头的,PostgreSQL在这种情况之下,在MongoDB和Firebase的追赶下还能保住第五已经是很不错。这篇文章来介绍一下PostgreSQL的基础功能和使用介绍。
从2020年8月份的TOP DB index的表现可以看到,前四名虽然暂时稳不可破,但是持续不停的下跌已经是目前的趋势,如没有特殊的事件或者技术出现,这个趋势应该会持续下去。前5名都是传统的关系型数据库,所以在这个整体下降的趋势背景之下,第5的PostgreSQL的稳定上升更显得尤为可贵。至于Firebase能够继续上升取代PostgreSQL的位置还只能是继续观望,但是作为传统的关系型数据库,PostgreSQL已经成为重要的选择项之一,或者说是MySQL与PostgreSQL二选一。
PostgreSQl有多种安装方式,本文使用最为简单的容器化方式。
步骤1: docker pull拉取官方镜像,官方镜像分普通版和alpine版,这里为了镜像尺寸小一点,选取拉取PostgreSQL 13的alpine版。
执行命令:docker pull postgres:12.4-alpine
liumiaocn:~ liumiao$ docker pull postgres:12.4-alpine 12.4-alpine: Pulling from library/postgres ...省略 Digest: sha256:b05c3311616d0d798225524e351423efa01dd3e5e6b56b2cca96a64d8fd4e746 Status: Downloaded newer image for postgres:12.4-alpine docker.io/library/postgres:12.4-alpine liumiaocn:~ liumiao$ docker images |grep 12.4-alpine postgres 12.4-alpine 3781fe35c6b8 2 weeks ago 157MB liumiaocn:~ liumiao$启动镜像
执行如下命令,即可将步骤1中拉取的PostgreSQL 12.4版本的数据库服务启动起来。
执行命令:docker run --name postgres -v ${HOME}/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=liuiaocn -d postgres:12.4-alpine
上述命令启动了如下的数据库服务:
项目 说明 PostgreSQL的版本 为12.4 容器名称 postgres 数据库密码 liumiaocn 数据卷挂载目录 dataliumiaocn:postgres liumiao$ docker run --name postgres -v ${HOME}/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=liuiaocn -d postgres:12.4-alpine a06874369dbfeff4b4a6f63d1410c566cdfc411f410126746d68a6b0b4e927c2 liumiaocn:postgres liumiao$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a06874369dbf postgres:12.4-alpine "docker-entrypoint.s…" 2 seconds ago Up 1 second 5432/tcp postgres liumiaocn:postgres liumiao$进入容器
liumiaocn:postgres liumiao$ docker exec -it postgres sh / # hostname a06874369dbf / # which psql /usr/local/bin/psql / #版本确认
可以通过内置的环境变量确认
/ # env |grep VERSION PG_VERSION=12.4 / #
也可以通过内置的psql确认客户端版本
/ # psql --version psql (PostgreSQL) 12.4 / #
或者通过show命令确认(连接之后才能使用,注意提示符)
postgres=# show server_version_num; server_version_num -------------------- 120004 (1 row) postgres=#
或者使用SELECT语句
postgres=# SELECT current_setting('server_version_num'); current_setting ----------------- 120004 (1 row) postgres=#
或者使用select version()语句
postgres=# select version(); version --------------------------------------------------------------------------------------- PostgreSQL 12.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 9.3.0) 9.3.0, 64-bit (1 row) postgres=#连接数据库
上述方式生成的数据库,缺省的数据库用户名为postgres,可以使用-U选项进行连接
/ # psql -U postgres psql (12.4) Type "help" for help. postgres=#
查询当前用户信息可以使用如下select语句
postgres=# select * from current_user; current_user -------------- postgres (1 row) postgres=#
也可以使用简化语句select user
postgres=# select user; user ---------- postgres (1 row) postgres=#查看版权信息
postgres=# \copyright PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95) Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group Portions Copyright (c) 1994, The Regents of the University of California Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. postgres=#查看已创建的数据库
/ # psql -U postgres psql (12.4) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres=#创建数据库
使用create database test创建名为test的数据库
postgres=# create database test; CREATE DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres test | postgres | UTF8 | en_US.utf8 | en_US.utf8 | (4 rows) postgres=#连接数据库
使用\c 数据库名 命令去连接所指定的数据库,比如\c test,将会连接刚刚创建的test数据库,在连接之后的操作比如创建表,在没有指明数据库名的情况下均对于当前所连接的数据库起作用。
postgres=# \c test You are now connected to database "test" as user "postgres". test=#基本操作 版本确认
虽然psql --version也可以确认版本,就像MySQL或者Oracle一样,在连接实例之后才能进行的确认方式,和MySQL的使用方式基本都一致。
test=# select version(); version --------------------------------------------------------------------------------------- PostgreSQL 12.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 9.3.0) 9.3.0, 64-bit (1 row) test=#字符串处理
MySQL中可以使用select "hello world"命令,在PostgreSQL可以使用类似如下命令(注意需要是单引号)
test=# select 'hello' || ' world'; ?column? ------------- hello world (1 row) test=#简单计算
类似Oracle里面的select from dual, 和mysql一样里面可以直接select
test=# select 3*7; ?column? ---------- 21 (1 row) test=#总结
总结