Diretório de artigos
Alvo
Use docker-compose para instalar o Postgresql 14, pgadmin4 e use-o de forma simples.
1. Instalação
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: [email protected]
PGADMIN_DEFAULT_PASSWORD: 123456
volumes:
postgres14:
Execute o seguinte comando no diretório onde o arquivo docker-compose.yaml está localizado:
docker-compose up -d
Se não estiver no diretório atual, especifique o arquivo yaml que você precisa usar.
docker-compose up -f docker-compose.yaml -d
Como você pode ver, ele foi instalado com sucesso.
Nota
- A localização dos volumes é a localização do método de armazenamento de dados montado. Lembre-se de substituí-lo por seu próprio diretório.
- Se for um Mac com chip M1, a imagem precisa ser substituída, que pode ser "arm64v8/postgres:14". (não testado)
1.2pgadmin4
O pgadmin4 foi iniciado, vamos usá-lo. Como a porta 80 foi mapeada para 20001, abra diretamente a porta localhost: 20001.
Neste momento, você pode adicionar o servidor, ou seja, adicionar o banco de dados. Na interface de conexão, o mais importante é o endereço do host
. Observe que o host aqui não pode ser preenchido com o host local da máquina. Devido ao problema de isolamento de rede do contêiner docker, o endereço IP interno do postgres precisa ser preenchido aqui. Como conseguir esse endereço?
docker inspect pg14
Este pg14 é o nome do contêiner do banco de dados. Você pode ver que os resultados de saída incluem gateway.
Você pode ver que o endereço aqui é 172.20.0.1. Preencha esse endereço e você poderá se conectar ao banco de dados com êxito.
2. Uso
2.1 Faça login via psql
Já que definimos
POSTGRES_USER: pg14
POSTGRES_PASSWORD: 123456
Então você pode fazer login usando o seguinte comando:
psql -h 127.0.0.1 -p 5432 -d postgres -U pg14
- O -h aqui se refere ao endereço onde o pg está instalado.
- -p número da porta, a configuração aqui é 5432
- -d é o nome do banco de dados. Por padrão, uma biblioteca postgres será criada.
- -U indica qual usuário usar para fazer login. O pg14 especificado durante a criação é usado aqui.
➜ 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=#
Para fazer login localmente, você pode usar o IP padrão e o número da porta.
2.2 CRUD
Após fazer login, você precisa criar um banco de dados, criar uma tabela, CURD...
\l Listar todos os bancos de dados
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 Criar banco de dados
criar banco de dados 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 Criar tabela e excluir tabela
CRIAR TABELA EMPRESA (
ID INT CHAVE PRIMÁRIA NÃO NULO,
NOME TEXTO NÃO NULO,
IDADE INT NÃO NULO,
ENDEREÇO CHAR(50),
SALÁRIO 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 Operações básicas
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. Permissões
Criar usuários e conceder permissões; revogar permissões e excluir usuários;
CRIAR teste de USUÁRIO COM SENHA '123456';
GRANT ALL ON great_company para testar;
revogar tudo em great_company do teste;
descartar teste de usuário;
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. Índice
4.1 Índice de coluna única
CREATE INDEX index_name
ON table_name (column_name);
4.2 Índice combinado
CREATE INDEX index_name
ON table_name (column1_name, column2_name);
4.3 Índice único
O uso de índices exclusivos não é apenas para desempenho, mas também para integridade de dados. Um índice exclusivo não permite a inserção de valores duplicados na tabela.
CREATE UNIQUE INDEX index_name
on table_name (column_name);
4.4 Quando você deve evitar o uso de índices?
Embora o objetivo dos índices seja melhorar o desempenho do banco de dados, há diversas situações em que os índices devem ser evitados.
Ao usar índices, considere as seguintes diretrizes:
Os índices não devem ser usados em tabelas menores.
Os índices não devem ser usados em tabelas que passam por operações frequentes de atualização ou inserção de grandes volumes.
Os índices não devem ser usados em colunas que contenham um grande número de valores NULL.
Os índices não devem ser usados em colunas operadas com frequência.
5. Instrução TRUNCATE
O objetivo da instrução TRUNCATE TABLE é limpar o conteúdo da tabela. A instrução DELETE sem cláusula condicional WHERE também significa limpar o conteúdo da tabela.A julgar pelos resultados da execução, os dois implementam a mesma função, mas os princípios de sua implementação são diferentes. A instrução TRUNCATE TABLE é uma instrução DDL, que é uma instrução de definição de dados. É equivalente a redefinir uma nova tabela e descartar diretamente o conteúdo da tabela original, então TRUNCATE TABLE será executado muito rapidamente; enquanto a instrução DELETE é um DML instrução, podemos pensar nela como A instrução DELETE exclui os dados um por um, portanto, a instrução DELETE é executada lentamente ao excluir várias linhas de dados.
6. Desative o envio automático
Desative a função autocommit no psql
\set AUTOCOMMIT off
"AUTOCOMMIT" neste comando está em letras maiúsculas e letras minúsculas não podem ser usadas. Se forem usadas letras minúsculas, nenhum erro será relatado, mas a operação de desligar o envio automático será inválida.