Inserção de dados com ClickHouse Connect: uso avançado
InsertContexts
insert e insert_df, em um InsertContext. Os métodos insert_arrow, insert_df_arrow e raw_insert enviam seus payloads diretamente e não usam 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, exceto o próprio context. 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
DateTime é um inteiro, o cliente o trata como um segundo desde a epoch.
Normalmente, não é necessário substituir um formato de escrita, mas os métodos em clickhouse_connect.datatypes.format podem definir um globalmente. Wrappers de contêiner, como Array, Nullable e LowCardinality, preservam o comportamento de formatação do tipo do elemento.
Opções de formato de escrita
Métodos de inserção especializados
insert_df— Insere um DataFrame do Pandas como dados Native orientados a colunas. Também oferece suporte a nomes/tipos de coluna explícitos ou a umInsertContextreutilizável.insert_arrow— Insere uma tabela PyArrow usando o formato de entrada Arrow do ClickHouse.insert_df_arrow— Insere um DataFrame do Pandas com Arrow como backend ou um DataFrame do Polars. Todas as colunas do Pandas devem usar backendsdtypebaseados em Arrow.
database, settings e transport_settings de HTTP por solicitação.
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)
Criar uma tabela a partir de um esquema do PyArrow
create_table_from_arrow_schema gera uma instrução CREATE TABLE a partir de campos escalares comuns do Arrow. O mapeamento abrange inteiros com e sem sinal, valores de ponto flutuante, booleanos, strings, datas e timestamps. Ele cria intencionalmente colunas do ClickHouse que não permitem NULL e gera TypeError para tipos do Arrow sem suporte, portanto revise o DDL gerado antes de executá-lo.
Fusos horários
datetime do Python em colunas DateTime ou DateTime64, o ClickHouse Connect os converte em valores de epoch.
Objetos datetime com fuso horário
O ClickHouse Connect usa o módulo
zoneinfo da biblioteca padrão. O driver não depende mais de pytz.Objetos datetime sem fuso horário
naive_datetime_insert controla inserções nativas de objetos Python com valores datetime sem fuso horário. Ela também se aplica a strings ISO sem fuso horário aceitas por colunas DateTime64.
"local"é o padrão na versão 1.x. O Python interpreta o valor no fuso horário do processo quando.timestamp()é chamado. Isso preserva o comportamento atual."server"interpreta o valor como hora do relógio no fuso horário declarado pela colunaDateTimeouDateTime64. Se a coluna não tiver fuso horário, usa o fuso horário do servidor informado quando o cliente se conectou.
datetime do Python ou strings ISO DateTime64 é serializada; portanto, a alteração se aplica a clientes existentes e contextos de inserção reutilizáveis.
"server", o ClickHouse Connect associa o tzinfo de destino antes de converter o valor em epoch. Para fusos horários IANA, segue as regras da biblioteca padrão para transições de horário de verão. Uma sobreposição no outono usa o valor fold do datetime. Por padrão, fold=0 seleciona o deslocamento anterior à transição, enquanto fold=1 seleciona o deslocamento posterior. Uma lacuna na primavera usa a mesma seleção de deslocamento e não é rejeitada nem normalizada.
Horários de relógio inexistentes na lacuna da primavera podem não ser preservados em uma conversão de ida e volta por meio de um parâmetro de consulta no modo de relógio, pois a análise de texto do ClickHouse pode selecionar um deslocamento diferente. Use um datetime com fuso horário ou um horário de relógio válido quando o instante for importante.
A opção se aplica apenas a inserções nativas de objetos Python datetime e strings ISO sem fuso horário aceitas por DateTime64. Colunas NumPy e Pandas com dtype datetime64 sem fuso horário mantêm a conversão existente de horário de relógio em UTC.
Para representar um instante específico independentemente de qualquer modo, associe o fuso horário desejado ou forneça explicitamente um inteiro epoch.
datetime sem fuso horário usam a configuração separada naive_datetime_binding. O modo padrão "wall" envia os campos de data e hora sem conversão para o horário local do host. Consulte a seção argumento Parameters.
Colunas DateTime com metadados de fuso horário
DateTime('America/Denver') ou DateTime64(3, 'Asia/Tokyo'). Esses metadados controlam como os valores são apresentados quando são consultados.
Ao inserir um valor com fuso horário, o ClickHouse Connect preserva o instante representado. Para um valor sem fuso horário, a configuração naive_datetime_insert controla se é usado o fuso horário do processo ou o da coluna. Ao consultar, o resultado usa o fuso horário da coluna, a menos que seja fornecido um override por coluna com o argumento column_tzs. O argumento query_tz não substitui o fuso horário declarado de uma coluna.
Inserções de arquivo
clickhouse_connect.driver.tools.insert_file transmite um arquivo local para uma tabela existente em fluxo e delega o parsing ao ClickHouse.
Configurações de formato de entrada, como
input_format_allow_errors_ratio e input_format_allow_errors_num, podem ser passadas por meio de settings.
AsyncClient, use await com insert_file_async e os mesmos argumentos:
raw_insert, portanto o conteúdo do arquivo permanece na memória.