PostgreSQL para usuários Mysql

Eu sei Mysql, então PostgreSQL não vai ser problema certo ? Errado.

Segue uma lista de soluções que enfrentei , que sirva de guia para quem já enfrentou os mesmos desafios.

Criando o primeiro Banco de Dados

Versão MySQL:

$ mysql -u root -p
 mysql> CREATE DATABASE dbTest;
 mysql> USE dbTest;

No Linux,  você deve logar com o usuário postgres  (após instalar o postgresql ).

$ su - postgres
 postgres@x220:~$ psql # Inicia o console
 postgres=# \h # Lista os comandos SQL disponíveis.
 postgres=# \h [comando] # Mostra o uso do [comando]

Cadê o CREATE DATABASE ?  Não tem, o comando é dado fora do console, deslogue do console com Ctrl-D ou \q e digite:

postgres@x220:~$ createdb dbTest

Legal, vamos entrar no console e usar o USE dbTest… Oops, não tem USE.

postgres=# \? # Lista os comandos internos
postgres=# \c dbTest

Agora você está conectado ao banco de dados “dbTest” como usuário “postgres”.

dbTest=#
OS X

No OS X o usuário postgres não é criado, então você deve rodar o psql no terminal.

CrIANDO UM NOVO USUÁRIO

No Mysql os comandos são parecidos com esses aqui:

mysql> CREATE USER milestone IDENTIFIED BY 'milestone';
mysql> GRANT ALL ON dbTest.* TO milestone;

No postgres a sintaxe é diferente, o comando \h CREATE USER explica.

dbTest=# CREATE USER milestone WITH PASSWORD "milestone";
ERROR: syntax error at or near ""milestone""

dbTest=# CREATE USER milestone WITH PASSWORD 'milestone';
postgres=# GRANT ALL ON DATABASE dbTest TO milestone;
ERROR: database "dbtest" does not exist

Oops, deu erro !!! O problem é que dbtaste realmente não existe, o nome do banco de dados foi convertido para lowercase no comando ( e foi executado dessa forma). A solução é usar aspas duplas como no exemplo abaixo:

postgres=# GRANT ALL ON DATABASE "dbTest" TO milestone;
GRANT

Legal! Agora vamos logar com esse usuário.

postgres=# \c - milestone
FATAL: Peer authentication failed for user "milestone"

hum…. Você deve configurar o  PostgreSQL  para permitir  que o usuario milestone tenha permissão de logar via password.  No arquivo /etc/postgresql/9.<x>/main/pg_hba.conf . Mude as linhas:

local all all peer

para

local all all md5

ou a linha abaixo para permitir apenas para o usuário milestone:

local all milestone md5

Obviamente essa linha deve ser colocada antes da regra válida para todos usuário ou não vai funcionar. Mais ou menos assim:

local all milestone md5
 local all all md5

PostgreSQL deve ser reiniciado:

# service postgresql restart

ou

# /etc/init.d/postgresql restart
PERMISSões Nas TABeLAS

Infelizmente todas as tentativas de ler ou escrever nas tabelas do banco vão falhar.

A especificação define uma hierarquia fixa de catalog.schema.table . No PG “catalog” é o banco de dados.

dbTest=# \dn
List of schemas
Name | Owner
--------+----------
 public | postgres
(1 row)

Então nosso usuário milestone precisa de permissão para acessar dbTest.public.* , tanto para todas as tabelas como as sequencias. A sequencia é usada (e alterada nos inserts) para alguns tipos de dados.

dbTest=# GRANT ALL ON ALL TABLES IN SCHEMA public TO milestone;
dbTest=# GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO milestone;
AUTO_INCREMENT

Obviamente não existe. Mas existe um tipo de dados para isso.

dbTest=# CREATE TABLE foo (id serial PRIMARY KEY, bar text);

O equivalente MySQL é:

mysql> CREATE TABLE foo (id int PRIMARY KEY AUTO_INCREMENT, bar text);
SHOW TABLES, DATABASES etc.
 postgres=# \l # SHOW DATABASES
 postgres=# \dt # SHOW TABLES
 postgres=# \d myTable # DESCRIBE myTable
Arquivos de configuração e testes

Uma instância PostgreSQL possui (e mantém) sua própria área de dados. Esse diretório (também conhecido como datadir) contém arquivos de configuração e a coleção de bancos de dados. Isso permite ter multiplas instâncias do PostgreSQL aceitando conexões em multiplas portas, mas isso também significa ao iniciar o postgres você sempre deverá informar o path dessa área de dados.

postgres@x220:~$ mkdir db13 # Cria nova area de dados
postgres@x220:~$ initdb -D db13 # Inicializa area de dados
postgres@x220:~$ postgres -D db13 & # Roda o PostgreSQL em background
postgres@x220:~$ pg_ctl status -D db13 # Checa se esta rodando
postgres@x220:~$ createdb dbTest # Cria novo banco
postgres@x220:~$ psql # Conecta ao PostgreSQL rodando na porta default (5432)
postgres@x220:~$ pg_ctl stop -D db13 # Para a instancia rodando em db13
postgres@x220:~$ postgres -D db12 -p 6543 & # Roda outro servidor, mas em uma area diferente e em outra porta (6543)
postgres@x220:~$ createdb dbTest -p 6543 # Cria novo DB (mantido pela segunda instancia na porta 6543)
postgres@x220:~$ psql -p 6543 # Conecta em db12

Para encontrar em qual diretório sua instancia do postgres está rodando, você pode usar algo como ps aux | grep postgres .

Socket file errors

Erros como:  /var/run/postgresql/.s.PGSQL.5432.lock not found podem acontecer em sistemas  Debian onde o PostgreSQL não está configurado para subir na inicialização ( rcconf –off postgresql por exemplo)
Existem duas soluções para esse problema, ou você cria /var/run/postgresql :

# mkdir /var/run/postgresql 
# chmod a+w /var/run/postgresql # adiciona permissão de escrita para o diretório

Ou você muda o arquivo postgresql.conf para escrever o socket em outro diretório, como o /tmp

unix_socket_directory = '/tmp' # (reinicie o postgres)

Por outro lado, você pode indicar ao postgreSQL o novo diretório de socket direto da linha de comando:

postgres@x220:~$ psql -h /tmp # Our socket directory is now /tmp

fonte: http://granjow.net/postgresql.html