Pular para o conteúdo principal
Todos os exemplos de código da API do ClickHouse podem ser encontrados aqui. Para a configuração da conexão, consulte Configuração. Para ver os tipos de dados compatíveis e os mapeamentos de tipos em Go, consulte Tipos de dados.

Conexão

O exemplo a seguir, que retorna a versão do servidor, demonstra como se conectar ao ClickHouse, supondo que o ClickHouse não esteja protegido e possa ser acessado com o usuário default. Observe que usamos a porta nativa padrão para a conexão.
Exemplo completo Em todos os exemplos a seguir, salvo indicação em contrário, assumimos que a variável conn do ClickHouse já foi criada e está disponível.

Execução

Instruções arbitrárias podem ser executadas com o método Exec. Isso é útil para DDL e instruções simples. Ele não deve ser usado para inserts maiores nem para iterações de consultas.
Exemplo completo Observe que é possível passar um Context para a consulta. Isso pode ser usado para definir configurações específicas no nível da consulta — veja Using Context.

Inserção em lote

Para inserir um grande número de linhas, o cliente oferece suporte a operações em lote. Isso exige a preparação de um lote ao qual é possível adicionar linhas. Em seguida, ele é enviado por meio do método 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.
Exemplo completo As recomendações para o ClickHouse estão aqui. Os lotes não devem ser compartilhados entre go-routines — construa um lote separado para cada rotina. A partir do exemplo acima, observe que os tipos das variáveis precisam estar alinhados com o tipo da coluna ao acrescentar linhas. Embora o mapeamento normalmente seja óbvio, essa interface busca ser flexível, e os tipos serão convertidos desde que não haja perda de precisão. Por exemplo, o trecho a seguir demonstra a inserção de uma string em um datetime64.
Exemplo completo Para ver um resumo completo dos tipos em Go compatíveis com cada tipo de coluna, consulte Conversões de tipos.

Colunas efêmeras

Colunas efêmeras são colunas apenas para escrita que existem somente durante a inserção — não são armazenadas e não podem ser selecionadas. Elas são úteis para calcular valores de colunas derivadas no momento da inserção.
Exemplo completo

Consultando linhas

Você pode consultar uma única linha usando o método 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.
Exemplo completo
Exemplo completo Observe que, em ambos os casos, é necessário passar um ponteiro para as variáveis nas quais queremos armazenar os respectivos valores das colunas. Elas devem ser passadas na ordem especificada na instrução 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

As inserções assíncronas são suportadas pelo método Async. Isso permite que o usuário especifique se o cliente deve esperar que o servidor conclua a inserção ou responda assim que receber os dados. Isso controla efetivamente o parâmetro wait_for_async_insert.
Exemplo completo

Inserção colunar

As inserções podem ser feitas em formato colunar. Isso pode trazer ganhos de desempenho se os dados já estiverem organizados dessa forma, evitando a necessidade de pivotar para linhas.
Exemplo completo

Usando structs

Para os usuários, as structs do Golang oferecem uma representação lógica de uma linha de dados no ClickHouse. Para facilitar isso, a interface nativa fornece várias funções úteis.

Select com serialização

O método Select permite serializar um conjunto de linhas de resposta em uma slice de structs com uma única chamada.
Exemplo completo

Scan em struct

ScanStruct permite mapear uma única linha de uma consulta para uma struct.
Exemplo completo

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.
Exemplo completo

Vinculação de parâmetros

O cliente oferece suporte à vinculação de parâmetros nos métodos 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.
Exemplo completo

Casos especiais

Por padrão, slices são expandidos em uma lista de valores separados por vírgulas quando passados como parâmetro para uma consulta. Se você precisar que um conjunto de valores seja injetado com os delimitadores [ ], 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.
Exemplo completo

Usando contexto

Os contextos do Go fornecem uma forma de passar prazos, sinais de cancelamento e outros valores com escopo de solicitação entre limites de API. Todos os métodos de uma conexão aceitam um contexto como primeiro parâmetro. Embora os exemplos anteriores tenham usado context.Background(), você pode usar esse recurso para passar configurações e prazos, além de cancelar consultas. Passar um contexto criado com 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.
Exemplo completo

Informações de Progress, Profile e Log

As informações de Progress, Profile e Log podem ser solicitadas para consultas. As informações de Progress relatam estatísticas sobre o número de linhas e bytes lidos e processados no ClickHouse. Já as informações de Profile fornecem um resumo dos dados retornados ao cliente, incluindo totais de bytes (não comprimidos), linhas e blocos. Por fim, as informações de Log fornecem estatísticas sobre threads, como uso de memória e taxa de processamento de dados. A obtenção dessas informações exige o uso de Context, ao qual o usuário pode passar funções de callback.
Exemplo completo

Varredura dinâmica

Pode ser necessário ler tabelas cujo esquema ou cujos tipos dos campos retornados sejam desconhecidos. Isso é comum em casos de análise de dados ad hoc ou no desenvolvimento de ferramentas genéricas. Para isso, informações sobre os tipos das colunas estão disponíveis nas respostas de consulta. Elas podem ser usadas com a reflexão do Go para criar, em tempo de execução, instâncias de variáveis com os tipos corretos, que podem ser passadas para Scan.
Exemplo completo

Tabelas externas

Tabelas externas permitem que o cliente envie dados ao ClickHouse junto com uma consulta SELECT. Esses dados são colocados em uma tabela temporária e podem ser usados na própria consulta para avaliação. Para enviar dados externos junto com uma consulta, o usuário deve criar uma tabela externa com ext.NewTable antes de passá-la por meio do contexto.
Exemplo completo

Open telemetry

O ClickHouse oferece suporte à propagação de contexto de rastreamento tanto em transportes TCP quanto HTTP. Ao usar TCP, o cliente serializa o span no protocolo binário nativo. Use 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.
Exemplo completo Mais detalhes sobre como usar tracing podem ser encontrados em suporte ao OpenTelemetry.
Última modificação em 2 de julho de 2026