Curso Rápido de Postgres
As anotações abaixo, assim como no antigo artigo sobre Oracle são focadas em usuários vindos do MySQL. Então vou assumir que você sabe o básico de SQL e está familiarizado com a linha de comando e operações como criar, exportar e importar bases de dados.
Lembre-se: a documentação do Postgres é sua melhor amiga!
Uma conta de usuário no Postgres é chamada de role
. E ele (PostGres) espera uma role
para seu usuário Unix. Então vamos criar uma nova role
para o usuário logado:
sudo -u postgres createuser -s $USER
Estamos criando um super usuário (-s
) para podermos criar novas bases de dados, outros usuários, etc.
Assim como o MySQL, o Postgres tem vários utilitários para a linha de comando, como o psql
(que é o cliente padrão), pg_dump
, pg_restore
e até mesmo alguns programas que estão atalhos para comandos SQL, como o createdb
e o createuser
.
Crie uma base de dados com (replace <database>
):
createdb <database>
Para se conectar a esta base e rodar comandos SQL:
psql -d <database>
Dentro do psql
, comandos não SQL sempre começam como uma barra invertida, como \q
usado para sair. Você pode consultar a ajuda usando \?
para comandos do psql
e \h
para comandos SQL.
Para conectar a uma base de dados remota:
psql -U <user> -d <database> -h '<host>'
Para executar uma consulta simples a partir do terminal:
psql -U <user> -d <database> -h '<host>' -W -c 'SELECT * FROM <table>'
Aspas nas String
Strings devem usar aspas simples:
UPDATE produtos SET nome = 'cool-aid';
Se precisar usar uma aspas simples dentro da string, use ela duas vezes:
UPDATE users SET nome = 'Sant''Anna';
Auto Incremento
O Postgres imita o auto incremento usando *sequences** do SQL, mas usando um atalho mais simples chamado SERIAL
.
Isso permite que criemos tabelas com auto incremento desse jeito:
CREATE TABLE produtos(
id SERIAL
);
Disponível em três tamanhos:
Nome | Memória | Capacidade |
---|---|---|
SMALLSERIAL | 2 bytes | 1 to 32,767 |
SERIAL | 4 bytes | 1 to 2,147,483,647 |
BIGSERIAL | 8 bytes | 1 to 9,223,372,036,854,775,807 |
Dump (Importar e exportar)
Para exportar uma base de dados, use o utilitário pg_dump
:
pg_dump -F c --file=<database>-$(date "+%Y-%m-%d").sql.gz --dbname=<database> --no-owner
Explicando os parâmetros:
-F c
: formato customizado, que usa compressão por padrão--no-owner
: não salva o proprietário dos objetos, então a propriedade vai pertencer ao usuário que irá importar os dados
Se você for exportar de uma base remota:
pg_dump -F c --file=<database>-$(date "+%Y-%m-%d").sql.gz --dbname=<database> --no-owner --username=<user> --host=<host> --port=5432
Importar
Importe uma base com (substitua <file>
e <database>
):
pg_restore -c <file>.sql.gz --dbname=<database>
O parâmetro -c
serve para limpar os objetos da base antes de os recriar.
Se quiser ignorar o proprietário do objetos (a role
do usuário logado será usada) você também pode usar o parâmetro --no-owner
.
Conexões locais sem senha
Algumas IDEs irão tentar conectar ao banco via socket, e podemos configurar o postgres pra permitir conexões locais sem precisar entrar a senha do usuário.
Edite o arquivo /etc/postgresql/<version>/main/pg_hba.conf
(substitua <version>
pela versão correta) e modifique METHOD
na seção relacionada a IPv4 para trust
:
# TYPE DATABASE USER ADDRESS METHOD
# local is for Unix domain socket connections only
# local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
Problemas Frequentes
Se alguma importação ou exportação falhar porque existe algum conectado a base de dados (ou seja, seu SQL está dando o erro ERROR: cannot drop the currently open database
):
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '<database>';
Se você estiver tentando importar um arquivo .gz
usando pg_restore
mas está enfrentando o erro pg_restore: error: input file does not appear to be a valid archive
, isso acontece porque o arquivo não foi gerado usando a opção -F c
. Ao invés disso, o dump foi primeiro gerado e depois compactado. Então tente importar o arquivo assim:
gunzip -c <file>.gz | psql <database>
-
Fixing Slack black screen sharing on Wayland
-
MySQL8: poor performance after upgrade
-
My experience leading an Open Source project
-
Samsung Anynet+ switching input modes when TV is turned on
-
Automated UI testing with Cypress and Shippable
-
Using ActionMailer with Localhost
-
Super Nintendo history
-
Using Wiimote as wireless mouse on Ubuntu
-
Updating Webkit on Ubuntu
-
Git Timesheet
-
Creating a Gmail filter for GitHub
-
Retro journey with Sega Master System
-
Configuring a Wiimote as a classic gamepad
-
Ubuntu 16.04 on Dell Precision M3800
-
Upgrading BIOS with Ubuntu
-
How to Disable wifi on Arris TG862 modem
-
Ubuntu 14.04 on Dell Precision M3800
-
Installing a Slack client on Ubuntu
-
Installing RVM on Ubuntu
-
Xbox360 gamepad on Ubuntu
-
English (US) International Keyboard on Ubuntu
-
Disable Wifi from Motorola SVG 1202 modem
-
Installing a Campfire client on Ubuntu (Snakefire)
-
How to Install Photoshop Elements 10 on Ubuntu
-
Recording Video throw the Web
-
Java Multimedia Player
-
Migrating from MySQL to Oracle
-
How to Write a Spell Checker
-
First Post