Pular para o conteúdo principal

Inserção de dados com ClickHouse Connect: uso avançado

InsertContexts

O ClickHouse Connect executa todas as inserções em um InsertContext. O InsertContext inclui todos os valores enviados como argumentos para o método insert do cliente. Além disso, quando um InsertContext é criado pela primeira vez, o ClickHouse Connect recupera os tipos de dados das colunas de inserção necessários para inserções eficientes no formato Native. Ao reutilizar o InsertContext em várias inserções, essa “pré-consulta” é evitada, e as inserções são executadas com mais rapidez e eficiência. Um InsertContext pode ser obtido usando o método create_insert_context do cliente. O método recebe os mesmos argumentos que a função insert. Observe que, para reutilização, apenas a propriedade data dos InsertContexts deve ser modificada. Isso está de acordo com seu propósito de fornecer um objeto reutilizável para inserções repetidas de novos dados na mesma tabela.
InsertContexts incluem estado mutável que é atualizado durante o processo de insert, portanto não são thread-safe.

Formatos de escrita

Atualmente, os formatos de escrita estão implementados para um número limitado de tipos. Na maioria dos casos, o ClickHouse Connect tentará determinar automaticamente o formato de escrita correto de uma coluna verificando o tipo do primeiro valor de dados não nulo. Por exemplo, ao inserir em uma coluna DateTime, se o primeiro valor inserido na coluna for um inteiro do Python, o ClickHouse Connect inserirá esse valor diretamente, partindo do pressuposto de que ele representa um segundo epoch. Na maioria dos casos, não é necessário substituir o formato de escrita de um tipo de dado, mas os métodos correspondentes no pacote clickhouse_connect.datatypes.format podem ser usados para fazer isso em nível global.

Opções de formato de escrita

Métodos de inserção especializados

O ClickHouse Connect fornece métodos de inserção especializados para formatos de dados comuns:
  • insert_df — Insere um DataFrame do Pandas. Em vez de usar o argumento data como uma Sequence of Sequences do Python, o segundo parâmetro desse método exige um argumento df, que deve ser uma instância de DataFrame do Pandas. O ClickHouse Connect processa automaticamente o DataFrame como uma fonte de dados orientada por colunas, portanto o parâmetro column_oriented não é necessário nem está disponível.
  • insert_arrow — Insere uma tabela PyArrow. O ClickHouse Connect passa a tabela Arrow sem modificações para o servidor ClickHouse para processamento, portanto, além de table e arrow_table, apenas os argumentos database e settings estão disponíveis.
  • insert_df_arrow — Insere um DataFrame do Pandas com Arrow como backend ou um DataFrame do Polars. O ClickHouse Connect determinará automaticamente se o DataFrame é do tipo Pandas ou Polars. Se for Pandas, será feita uma validação para garantir que o backend dtype de cada coluna seja baseado em Arrow, e um erro será gerado se alguma não for.
Um array do NumPy é uma Sequence of Sequences válida e pode ser usado como argumento data no método principal insert, portanto não é necessário um método especializado.

Inserção de DataFrame do Pandas

Inserção de tabela PyArrow

Inserção de DataFrame com Arrow como backend (pandas 2.x)

Fusos horários

Ao inserir objetos datetime.datetime do Python em colunas DateTime ou DateTime64 do ClickHouse, o ClickHouse Connect trata automaticamente as informações de fuso horário. Como o ClickHouse armazena internamente todos os valores DateTime como timestamps Unix sem fuso horário (segundos ou frações de segundo desde a epoch), a conversão de fuso horário ocorre automaticamente no lado do cliente durante a inserção.

Objetos datetime com fuso horário

Se você inserir um objeto datetime.datetime do Python com fuso horário, o ClickHouse Connect chamará automaticamente .timestamp() para convertê-lo em um Unix timestamp, o que leva corretamente em conta o deslocamento do fuso horário. Isso significa que você pode inserir objetos datetime de qualquer fuso horário, e eles serão armazenados corretamente como o timestamp equivalente em UTC.
Neste exemplo, os três objetos datetime representam instantes diferentes, porque têm fusos horários diferentes. Cada um será convertido corretamente para o respectivo Unix timestamp e armazenado no ClickHouse.
Ao usar pytz, você deve usar o método localize() para adicionar informações de fuso horário a um datetime ingênuo. Passar tzinfo= diretamente para o construtor de datetime usará deslocamentos históricos incorretos. Para UTC, tzinfo=pytz.UTC funciona corretamente. Consulte a documentação do pytz para mais informações.

Objetos datetime sem informação de fuso horário

Se você inserir um objeto datetime.datetime do Python sem informação de fuso horário (ou seja, sem tzinfo), o método .timestamp() o interpretará como se estivesse no fuso horário local do sistema. Para evitar ambiguidades, recomenda-se:
  1. Sempre usar objetos datetime com fuso horário ao inserir, ou
  2. Garantir que o fuso horário do sistema esteja definido como UTC, ou
  3. Converter manualmente para timestamps epoch antes de inserir

Colunas DateTime com metadados de fuso horário

As colunas do ClickHouse podem ser definidas com metadados de fuso horário (por exemplo, DateTime('America/Denver') ou DateTime64(3, 'Asia/Tokyo')). Esses metadados não afetam a forma como os dados são armazenados (ainda como timestamps UTC), mas controlam o fuso horário usado ao consultar os dados no ClickHouse. Ao inserir dados nessas colunas, o ClickHouse Connect converte seu datetime do Python em um Unix timestamp (considerando o fuso horário, se houver). Ao consultar os dados novamente, o ClickHouse Connect retorna o datetime convertido para o fuso horário da coluna, independentemente do fuso horário usado na inserção.

Inserções de arquivos

O pacote clickhouse_connect.driver.tools inclui o método insert_file, que permite inserir dados diretamente do sistema de arquivos em uma tabela existente do ClickHouse. O parsing é delegado ao servidor ClickHouse. insert_file aceita os seguintes parâmetros: Para arquivos com dados inconsistentes ou valores de data/hora em um formato incomum, este método reconhece configurações aplicáveis a importações de dados (como input_format_allow_errors_num e input_format_allow_errors_num).
Última modificação em 2 de julho de 2026