clickhousedb, baseado no driver principal. Ele oferece suporte ao SQLAlchemy 1.4.40 e versões posteriores, incluindo o SQLAlchemy 2.x, com foco em consultas Core, DDL do ClickHouse, reflexão e inserts simples de ORM.
Instale as dependências do SQLAlchemy com o package extra:
Conecte-se ao SQLAlchemy
clickhousedb:// ou clickhousedb+connect://:
compression, query_limit e limites de tempo, ou opções de HTTP/TLS, como ca_cert. Adicione o prefixo ch_ a uma configuração do ClickHouse para forçar que ela seja tratada como uma configuração do servidor quando necessário, por exemplo, ch_http_max_field_name_size=99999.
Consulte Argumentos e configurações de conexão para ver as opções de cliente disponíveis.
Configurações por consulta
Formatos de leitura por consulta
query_formats. Os formatos da instrução são aplicados primeiro e substituem as chaves e os wildcards correspondentes da conexão ou do engine.
Parâmetros do lado do servidor
IN compatíveis se tornam parâmetros Array tipados do ClickHouse. O compilador gera CompileError quando não consegue inferir um tipo compatível nem processar um parâmetro associado com segurança.
Consultas do Core
SELECT do SQLAlchemy Core com junções, filtros, ordenação, cláusulas LIMIT e OFFSET, e DISTINCT.
DELETE e ele exige uma cláusula WHERE explícita:
Subcolunas JSON
JSON do ClickHouse, use colchetes para selecionar, de cada vez, um segmento do caminho de uma subcoluna com suporte de armazenamento:
payload["severity"] é compilado na sintaxe de identificador pontilhado do ClickHouse. Cada parte é colocada entre aspas separadamente, por exemplo `events`.`payload`.`severity`. Ele lê a subcoluna JSON armazenada do ClickHouse e não chama getSubcolumn. Encadeie [] ou .subcolumn() uma vez para cada segmento do caminho. Cada segmento deve ser uma string não vazia.
Passar type_ para .subcolumn() envolve o caminho pontilhado em um CAST SQL e atribui esse tipo à expressão do SQLAlchemy. Sem type_, .subcolumn("segment") se comporta como ["segment"].
Um caminho sem tipo tem o tipo Dynamic do ClickHouse. O ClickHouse não permite valores Dynamic diretamente em ORDER BY ou GROUP BY. Passe type_ quando uma subcoluna for usada nesses contextos.
Para código com tipagem estática, importe json_subcolumn de clickhouse_connect.cc_sqlalchemy. O auxiliar também aceita um segmento por vez e preserva o tipo de resultado Python de type_:
request_id como ColumnElement[int].
Cada segmento é colocado entre backticks independentemente, inclusive nomes com espaços ou backticks. Os backticks não fazem com que um ponto seja tratado como literal pelo processamento de JSON path do ClickHouse. Quando json_type_escape_dots_in_keys estiver habilitado, use a codificação %2E do ClickHouse para pontos literais em chaves. Acesse uma chave chamada a.b como payload["a%2Eb"], e não como payload["a.b"].
Extensões de consulta do ClickHouse
select de clickhouse_connect.cc_sqlalchemy para expor métodos tipados do ClickHouse a verificadores estáticos de tipos. O sqlalchemy.select padrão também disponibiliza esses métodos em tempo de execução.
Select do ClickHouse são:
Por exemplo, é possível encadear um
GLOBAL ANY LEFT JOIN do ClickHouse sem aninhar uma FromClause personalizada:
Lambda nas funções de ordem superior do ClickHouse:
values() do SQLAlchemy é compilada para a sintaxe da função de tabela VALUES do ClickHouse, inclusive quando usada em uma expressão de tabela comum. A forma CTE exige o SQLAlchemy 2.0.42 ou posterior, no qual Values.cte() foi adicionada.
CTEs materializadas
materialized=True para .cte() a fim de gerar WITH <name> AS MATERIALIZED (...), que calcula o corpo uma única vez:
enable_materialized_cte=1, e o analyzer está habilitado. Defina enable_materialized_cte na instrução, na conexão ou no engine, conforme mostrado em Configurações por consulta. O analyzer é habilitado por padrão em todos os servidores compatíveis com esse recurso; portanto, definir explicitamente enable_analyzer=1 é uma medida de precaução. enable_materialized_cte é uma configuração experimental do ClickHouse. Com enable_materialized_cte=0 ou enable_analyzer=0, a consulta é executada com êxito e retorna as mesmas linhas. O ClickHouse ignora silenciosamente MATERIALIZED e volta a expandir a CTE inline; assim, esquecer essa configuração prejudica o desempenho sem emitir nenhum aviso. CTEs materializadas exigem o ClickHouse 26.3 ou posterior. Servidores mais antigos rejeitam a palavra-chave com um erro de sintaxe.
Para uma instrução criada com o sqlalchemy.select padrão, use cte() no nível do módulo. Ela recebe a instrução como primeiro argumento e, no restante, espelha Select.cte():
ValueError quando recursive=True e materialized=True são definidos.
DDL e reflexão
server_default para expressões DEFAULT e atributos específicos do dialeto, como clickhouse_codec, clickhouse_ttl, clickhouse_materialized e clickhouse_alias, quando presentes.
Argumentos de chave do MergeTree, como order_by, partition_by, primary_key, sample_by e ttl, aceitam colunas do SQLAlchemy e expressões SQL, bem como strings simples.
Inserções e uso básico de ORM
Migrações do Alembic
clickhouse_connect.cc_sqlalchemy.alembic no env.py do Alembic para registrar a integração com o dialeto. A autogeração oferece suporte a alterações comuns em tabelas, incluindo criação e remoção de tabelas, adição/alteração/remoção de colunas, valores padrão e comentários. Use operações manuais para renomear tabelas e colunas. Revise cada migração gerada antes de aplicá-la.
Os helpers op.* específicos do ClickHouse abrangem:
- data skipping indexes, incluindo operações de adição, materialização e remoção.
- projeções, incluindo operações de adição, materialização e remoção.
- Modificação e redefinição de configurações de tabela em tabelas MergeTree.
- Criação e remoção de visão materializada.
- Criação, remoção e recarregamento de dicionário.
Index, Column(index=True), op.create_index e op.drop_index são rejeitados para evitar DDL parcial ou incorreto. Use op.add_clickhouse_index e op.drop_clickhouse_index.
Consulte o exemplo completo do Alembic. Os usuários que estão migrando de clickhouse-sqlalchemy também devem ler o guia de migração.
Escopo e limitações
- O ClickHouse não oferece transações tradicionais por meio deste dialeto HTTP.
engine.begin()eSession.commit()organizam o trabalho no lado do Python, mas commit e rollback são operações sem efeito no servidor. UPDATE, transações em duas fases, sequências,RETURNINGe níveis avançados de isolamento não são implementados por este dialeto. Use ClickHouse SQL explicitamente para mutações no servidor, quando necessário.Column(..., primary_key=True)fornece a identidade de objeto no SQLAlchemy. Isso não cria uma restrição de unicidade do lado do servidor. Defina as expressões de ordenação e, opcionalmente, de chave primária por meio do engine da tabela.- Metadados tradicionais de chaves estrangeiras, restrições de unicidade e índices padrão não estão disponíveis, porque o ClickHouse não impõe essas restrições.
- Gerenciamento de relacionamentos do ORM, atualizações de unit of work, cascatas e carregamento imediato ou lazy de relacionamentos estão fora do escopo de ORM suportado.