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
Se você quiser importar um arquivo SQL, use o comando psql (substitua <database> e <file>):
psql -d <database> -a -f <file>.sql
Se você quiser importar uma base de dados inteira em formato compactado (.gz), importe com o comando pg_restore (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
E então reinicie o serviço do Postgres:
sudo service postgresql restart
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>

