Pular para o conteúdo

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.

MotorMarcaExemplo
SQLite?where id = ?
PostgreSQL$1, $2where id = $1
MySQL / MariaDB?where id = ?

Os tipos que só o Postgres tem#

TipoChega comoObservação
serial / bigserialIntegera sequência é do servidor; o id volta no criar
numeric / decimaltexto exato, convertidonão vira Float: o arredondamento binário é o que Arcane.Decimal existe para evitar
timestamp / timestamptzDataHoraguarde em UTC; o fuso é de quem apresenta
jsonbtextouse Arcane.Serialization para ler
text[]textoarrays não têm tipo próprio na linguagem
uuidtextoCrypto.uuid4() gera

O que o Postgres não perdoa e o SQLite perdoa#

No SQLite passaNo PostgresPorque
"texto" como literalerroaspas duplas são identificador; literal é aspas simples
inserir texto numa coluna integererroo SQLite tem afinidade de tipo, e não tipo
select a, b … group by aerrotoda coluna do select tem de estar no group by ou numa agregação
comparar integer com texterronão há conversão implícita
tabela sem chave primáriapassa, e dói depoisreplicação e ON CONFLICT precisam dela

Continue em O banco em contêiner.