Conexão
default.
Observe que usamos a porta nativa padrão para a conexão.
conn do ClickHouse já foi criada e está disponível.
Execução
Exec. Isso é útil para DDL e instruções simples. Ele não deve ser usado para inserts maiores nem para iterações de consultas.
Inserção em lote
Send(). Os lotes permanecem na memória até que Send seja executado.
Recomenda-se chamar Close no lote para evitar vazamento de conexões. Isso pode ser feito com a palavra-chave defer após preparar o lote. Isso liberará a conexão caso Send nunca seja chamado. Observe que, se nenhuma linha for adicionada, o log de consultas mostrará 0 linhas inseridas.
Colunas efêmeras
Consultando linhas
QueryRow ou obter um cursor para iterar sobre um conjunto de resultados com Query. Enquanto o primeiro permite informar um destino no qual os dados serão serializados, o segundo exige chamar Scan para cada linha.
SELECT — por padrão, a ordem de declaração das colunas será usada no caso de um SELECT *, como mostrado acima.
Assim como na inserção, o método Scan exige que as variáveis de destino sejam de um tipo apropriado. Novamente, a ideia é ser flexível, convertendo tipos sempre que possível, desde que não haja perda de precisão; por exemplo, o exemplo acima mostra uma coluna UUID sendo lida em uma variável string. Para ver uma lista completa dos tipos Go compatíveis com cada tipo de coluna, consulte Conversões de tipos.
Por fim, observe que é possível passar um Context para os métodos Query e QueryRow. Isso pode ser usado para configurações no nível da consulta — consulte Usando Context para mais detalhes.
Inserção assíncrona
Inserção colunar
Usando structs
Select com serialização
Scan em struct
ScanStruct permite mapear uma única linha de uma consulta para uma struct.
Anexar struct
AppendStruct permite anexar uma struct a um lote existente e interpretá-la como uma linha completa. Isso exige que as colunas da struct correspondam à tabela tanto no nome quanto no tipo. Embora todas as colunas devam ter um campo equivalente na struct, alguns campos da struct podem não ter uma coluna equivalente. Eles serão simplesmente ignorados.
Vinculação de parâmetros
Exec, Query e QueryRow. Como mostrado no exemplo abaixo, isso é compatível com parâmetros nomeados, numerados e posicionais. A seguir, apresentamos exemplos de cada um deles.
Casos especiais
[ ], use ArraySet.
Se forem necessários grupos/tuplas, com os delimitadores ( ), por exemplo, para uso com operadores IN, você pode usar GroupSet. Isso é particularmente útil quando vários grupos são necessários, como mostrado no exemplo abaixo.
Por fim, campos DateTime64 exigem precisão para garantir que os parâmetros sejam renderizados corretamente. No entanto, o nível de precisão do campo é desconhecido para o cliente, então o usuário precisa informá-lo. Para isso, fornecemos o parâmetro DateNamed.
Usando contexto
withDeadline permite definir limites de tempo de execução para as consultas. Observe que esse é um horário absoluto, e a expiração apenas liberará a conexão e enviará um sinal de cancelamento ao ClickHouse. Como alternativa, WithCancel pode ser usado para cancelar explicitamente uma consulta.
As funções auxiliares clickhouse.WithQueryID e clickhouse.WithQuotaKey permitem especificar um ID de consulta e uma chave de quota. IDs de consulta podem ser úteis para rastrear consultas nos logs e para fins de cancelamento. Uma chave de quota pode ser usada para impor limites ao uso do ClickHouse com base em um valor de chave exclusivo - consulte Quotas Management para mais detalhes.
Você também pode usar o contexto para garantir que uma configuração seja aplicada apenas a uma consulta específica, em vez de à conexão inteira, como mostrado em Connection Settings.
Por fim, você pode controlar o tamanho do buffer de blocos por meio de clickhouse.WithBlockSize. Isso substitui a configuração de nível de conexão BlockBufferSize e controla o número máximo de blocos decodificados e mantidos na memória a qualquer momento. Valores maiores podem significar mais paralelismo, à custa de memória.
Exemplos do que foi descrito acima são mostrados abaixo.
Informações de Progress, Profile e Log
Varredura dinâmica
Scan.
Tabelas externas
ext.NewTable antes de passá-la por meio do contexto.
Open telemetry
clickhouse.WithSpan para associar um span a uma consulta por meio do contexto.
Limitação do transporte HTTPEmbora o servidor ClickHouse aceite os cabeçalhos HTTP padrão
traceparent / tracestate, o transporte HTTP do clickhouse-go atualmente não os envia — WithSpan não tem efeito via HTTP. Como alternativa, você pode definir manualmente o cabeçalho por meio de HttpHeaders nas opções de conexão.