banner

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>