文章目录
- 目标
- 1. 安装
- 1.1 docker-compose.ymal
- 1.2 pgadmin4
- 2. 使用
- 2.1 登录 via psql
- 2.2 CRUD
- 2.2.1 创建数据库
- 2.2.2 创建表,删除表
- 2.2.3 基本操作
- 3. 权限
- 4. 索引
- 4.1 单列索引
- 4.2 组合索引
- 4.3 唯一索引
- 4.4 什么情况下要避免使用索引?
- 5. TRUNCATE 语句
- 6. 关闭自动提交
目标
使用docker-compose安装Postgresql 14,pgadmin4并进行简单的使用。
1. 安装
1.1 docker-compose.ymal
version: "3.5"
services:
postgres:
container_name: pg14
image: postgres:14
environment:
POSTGRES_USER: pg14
POSTGRES_PASSWORD: 123456
PGDATA: /data/postgres
volumes:
- postgres14:/Users/yuanyao/tools/pg
ports:
- "5432:5432"
restart: unless-stopped
pgadmin4:
container_name: pgadmin4
image: dpage/pgadmin4
ports:
- 20001:80
environment:
PGADMIN_DEFAULT_EMAIL: xx@163.com
PGADMIN_DEFAULT_PASSWORD: 123456
volumes:
postgres14:
在docker-compose.yaml文件所在目录运行如下指令:
docker-compose up -d
如果不在当前目录,那就自己指定需要使用的yaml文件
docker-compose up -f docker-compose.yaml -d
可以看到,这样就已经成功安装好了
注意
- volumes的位置是挂载的数据存方法位置,记得要替换成自己的目录。
- 如果是M1芯片的Mac,image需要替换,可能是这个“arm64v8/postgres:14”。(未经测试)
1.2 pgadmin4
pgadmin4已经启动,那就用起来。由于已经把80端口映射到20001,直接打开localhost:20001端口
这个时候,可以添加server,即添加数据库。在connection界面,最重要的是host地址
注意,这里的host不可以填写本机的localhost。由于docker容器的网络隔离问题,这里需要填写postgres的内部 IP地址。如何获取这个地址?
docker inspect pg14
这个pg14是数据库容器名,可以看到输出的结果包括gateway
可以看到这了的地址是172.20.0.1.将这个地址填入,就可以顺利连接数据库。
2. 使用
2.1 登录 via psql
由于我们已经设置了
POSTGRES_USER: pg14
POSTGRES_PASSWORD: 123456
那么可以使用如下指令登录:
psql -h 127.0.0.1 -p 5432 -d postgres -U pg14
- 这里的-h是指安装pg的地址
- -p 端口号,这里设置的是5432
- -d是数据库的名字,这里默认是会创建一个postgres库
- -U是使用哪个用户登录,这里使用的是创建时指定的pg14
➜ pg docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c64dc3d68eb2 postgres:14 "docker-entrypoint.s…" 42 hours ago Up 42 hours 0.0.0.0:5432->5432/tcp pg14
➜ pg docker exec -it pg14 bash
root@c64dc3d68eb2:/# cd data/
root@c64dc3d68eb2:/data# cd postgres/
root@c64dc3d68eb2:/data/postgres# ls
base pg_dynshmem pg_logical pg_replslot pg_stat pg_tblspc pg_wal postgresql.conf
global pg_hba.conf pg_multixact pg_serial pg_stat_tmp pg_twophase pg_xact postmaster.opts
pg_commit_ts pg_ident.conf pg_notify pg_snapshots pg_subtrans PG_VERSION postgresql.auto.conf postmaster.pid
root@c64dc3d68eb2:/data/postgres# psql -h 127.0.0.1 -p 5432 -d postgres -U pg14
psql (14.3 (Debian 14.3-1.pgdg110+1))
Type "help" for help.
postgres=#
postgres=# exit
root@c64dc3d68eb2:/data/postgres# psql -d postgres -U pg14
psql (14.3 (Debian 14.3-1.pgdg110+1))
Type "help" for help.
postgres=#
本机登录,可以使用默认的IP和端口号。
2.2 CRUD
登录进来后,就要创建数据库,创建表,CURD……
\l 列出所有数据库
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+------------+------------+-------------------
postgres | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 | =c/pg14 +
| | | | | pg14=CTc/pg14
template1 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 | =c/pg14 +
| | | | | pg14=CTc/pg14
(3 rows)
2.2.1 创建数据库
create database pg14;
postgres=# create database pg14;
CREATE DATABASE
postgres=# \l
pg14 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
pgtest | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 | =c/pg14 +
| | | | | pg14=CTc/pg14
template1 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 | =c/pg14 +
| | | | | pg14=CTc/pg14
postgres=# \c pg14;
You are now connected to database "pg14" as user "pg14".
pg14=# \l
pg14 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
pgtest | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | pg14 | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 | =c/pg14 +
| | | | | pg14=CTc/pg14
template1 | pg14 | UTF8 | en_US.utf8 | en_US.utf8 | =c/pg14 +
| | | | | pg14=CTc/pg14
2.2.2 创建表,删除表
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
pg14=# CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE
pg14=# \d
List of relations
Schema | Name | Type | Owner
--------+---------+-------+-------
public | company | table | pg14
(1 row)
pg14=# \dt
public | company | table | pg14
pg14=# \d company
id | integer | | not null |
name | text | | not null |
age | integer | | not null |
address | character(50) | | |
salary | real | | |
pg14=# \d
public | company | table | pg14
pg14=# drop table company;
DROP TABLE
pg14=# \d
Did not find any relations.
2.2.3 基本操作
pg14=# insert into company(id, name, age,address) values(11, 'tom',23,'xxx');
INSERT 0 1
pg14=# select * from company;
11 | tom | 23 | xxx |
pg14=# insert into company(id, name, age,address) values(12, 'Jerry',23,'xxx');
INSERT 0 1
pg14=# select * from company;
11 | tom | 23 | xxx |
12 | Jerry | 23 | xxx |
pg14=# update company set name = 'TOM' where name = 'tom';
UPDATE 1
pg14=# select * from company;
12 | Jerry | 23 | xxx |
11 | TOM | 23 | xxx |
pg14=# ALTER TABLE company add email VARCHAR(40);
ALTER TABLE
pg14=# \d company;
id | integer | | not null |
name | text | | not null |
age | integer | | not null |
address | character(50) | | |
salary | real | | |
email | character varying(40) | | |
pg14=# ALTER TABLE company drop column salary;
ALTER TABLE
pg14=# \d company;
id | integer | | not null |
name | text | | not null |
age | integer | | not null |
address | character(50) | | |
email | character varying(40) | | |
pg14=# ALTER TABLE company RENAME TO great_company;
ALTER TABLE
pg14=# \d
public | great_company | table | pg14
pg14=#
3. 权限
创建用户并赋予权限;撤销权限并删除用户;
CREATE USER test WITH PASSWORD ‘123456’;
GRANT ALL ON great_company to test;
revoke all on great_company from test;
drop user test;
pg14=# CREATE USER test WITH PASSWORD '123456';
CREATE ROLE
pg14=# \du test
test | | {}
pg14=# GRANT ALL ON great_company to test;
GRANT
pg14=# revoke all on great_company from test;
REVOKE
pg14=# drop user test;
DROP ROLE
4. 索引
4.1 单列索引
CREATE INDEX index_name
ON table_name (column_name);
4.2 组合索引
CREATE INDEX index_name
ON table_name (column1_name, column2_name);
4.3 唯一索引
使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中。
CREATE UNIQUE INDEX index_name
on table_name (column_name);
4.4 什么情况下要避免使用索引?
虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。
使用索引时,需要考虑下列准则:
索引不应该使用在较小的表上。
索引不应该使用在有频繁的大批量的更新或插入操作的表上。
索引不应该使用在含有大量的 NULL 值的列上。
索引不应该使用在频繁操作的列上。
5. TRUNCATE 语句
TRUNCATE TABLE语句的用途是清空表内容。不带WHERE条件子句的 DELETE语句也表示清空表内容,从执行结果来看,两者实现了相同的 功能,但两者实现的原理是不一样的。TRUNCATE TABLE语句是DDL语 句,即数据定义语句,相当于用重新定义一个新表的方法把原表的内 容直接丢弃了,所以TRUNCATE TABLE执行起来会很快;而DELETE语句 是DML语句,我们可以认为DELETE语句是把数据一条一条地删除,所以 DELETE语句删除多行数据时执行起来比较慢。
6. 关闭自动提交
在psql中关闭自动提交功能
\set AUTOCOMMIT off
这个命令中的“AUTOCOMMIT”是大写的,不能使用小 写,如果使用小写,虽不会报错,但会导致关闭自动提交的操作无 效。