PostgreSQL
O driver, os tipos, os parâmetros posicionais e o que o Postgres não perdoa — com o contêiner pronto.
O driver fala o protocolo v3 por socket: aperto de mão, autenticação (md5 e scram-sha-256), consulta simples e consulta estendida com parâmetros. Não há psycopg no caminho.
Conectar#
dataforge
adopt Arcane.Forge as Forge
// O motor sai da URL; a porta padrao e 5432.
db := Forge.esperar("postgres://forge:segredo@localhost:5432/loja",
prazo := 30.0)
out Forge.versao(db)
out $"tabelas: {len(Forge.tabelas(db))}"
Forge.fechar(db)Os parâmetros são `$1`, e não `?`#
Cada banco tem a sua marca de parâmetro, e trocá-la é o primeiro erro de quem vem do SQLite. O construtor de consultas cuida disso sozinho — o cuidado é para o SQL escrito à mão.
| Motor | Marca | Exemplo |
|---|---|---|
| SQLite | ? | where id = ? |
| PostgreSQL | $1, $2 | where id = $1 |
| MySQL / MariaDB | ? | where id = ? |
Os tipos que só o Postgres tem#
| Tipo | Chega como | Observação |
|---|---|---|
serial / bigserial | Integer | a sequência é do servidor; o id volta no criar |
numeric / decimal | texto exato, convertido | não vira Float: o arredondamento binário é o que Arcane.Decimal existe para evitar |
timestamp / timestamptz | DataHora | guarde em UTC; o fuso é de quem apresenta |
jsonb | texto | use Arcane.Serialization para ler |
text[] | texto | arrays não têm tipo próprio na linguagem |
uuid | texto | Crypto.uuid4() gera |
O que o Postgres não perdoa e o SQLite perdoa#
| No SQLite passa | No Postgres | Porque |
|---|---|---|
"texto" como literal | erro | aspas duplas são identificador; literal é aspas simples |
inserir texto numa coluna integer | erro | o SQLite tem afinidade de tipo, e não tipo |
select a, b … group by a | erro | toda coluna do select tem de estar no group by ou numa agregação |
comparar integer com text | erro | não há conversão implícita |
| tabela sem chave primária | passa, e dói depois | replicação e ON CONFLICT precisam dela |
Continue em O banco em contêiner.