Conversões de tipo
Append/AppendRow) e leitura (via Scan). Se você precisar de suporte para uma conversão específica, abra uma issue.
A interface padrão database/sql deve oferecer suporte aos mesmos tipos que a ClickHouse API. Há algumas exceções, principalmente para tipos complexos, documentadas nas seções abaixo. Assim como a ClickHouse API, o cliente busca ser o mais flexível possível quanto à aceitação de tipos de variáveis tanto para inserção quanto para o marshaling de respostas.
Tipos complexos
Date/DateTime
Date, Date32, DateTime e DateTime64. Datas podem ser inseridas como string no formato 2006-01-02 ou usando os tipos nativos do Go time.Time{} ou sql.NullTime. DateTime também oferece suporte a esses tipos, mas exige que as strings sejam passadas no formato 2006-01-02 15:04:05, com um deslocamento de fuso horário opcional, por exemplo 2006-01-02 15:04:05 +08:00. time.Time{} e sql.NullTime também têm suporte na leitura, assim como qualquer implementação da interface sql.Scanner.
O tratamento das informações de fuso horário depende do tipo do ClickHouse e de o valor estar sendo inserido ou lido:
- DateTime/DateTime64
- No momento do insert, o valor é enviado ao ClickHouse no formato de timestamp Unix. Se nenhum fuso horário for informado, o cliente assumirá o fuso horário local do cliente.
time.Time{}ousql.NullTimeserão convertidos para epoch de acordo com isso. - No momento do select, o fuso horário da coluna será usado, se estiver definido, ao retornar um valor
time.Time. Caso contrário, será usado o fuso horário do servidor.
- No momento do insert, o valor é enviado ao ClickHouse no formato de timestamp Unix. Se nenhum fuso horário for informado, o cliente assumirá o fuso horário local do cliente.
- Date/Date32
- No momento do insert, o fuso horário de qualquer data é considerado ao converter a data para um timestamp Unix; ou seja, ele será ajustado pelo fuso horário antes de ser armazenado como data, já que os tipos
Datenão têm localidade no ClickHouse. Se isso não for especificado em um valor de string, será usado o fuso horário local. - No momento do select, as datas lidas em instâncias
time.Time{}ousql.NullTime{}serão retornadas sem informações de fuso horário.
- No momento do insert, o fuso horário de qualquer data é considerado ao converter a data para um timestamp Unix; ou seja, ele será ajustado pelo fuso horário antes de ser armazenado como data, já que os tipos
Tipos Time/Time64
Time e Time64 armazenam valores de hora do dia sem um componente de data. Ambos são mapeados para time.Duration do Go.
Timearmazena a hora com precisão de segundos.Time64(precision)oferece suporte à precisão de subsegundos (comoDateTime64), em que a precisão vai de 0 a 9.
Array
Map
Ao usar a API
database/sql, os valores de Map exigem tipagem estrita — você não pode usar interface{} como tipo de valor. Por exemplo, não é possível passar um map[string]interface{} para um campo Map(String,String); em vez disso, é preciso usar um map[string]string. Já uma variável interface{} será sempre compatível e pode ser usada para estruturas mais complexas.Exemplo completoTuplas
Nested
map[string]interface{}. No momento, os valores não são fortemente tipados.
flatten_tested=0
Se o valor padrão 1 for usado para flatten_nested, as colunas aninhadas serão achatadas em arrays separados. Isso exige o uso de slices aninhados para inserção e recuperação. Embora níveis arbitrários de aninhamento possam funcionar, isso não é oficialmente suportado.
flatten_nested=1
Observação: as colunas Nested devem ter as mesmas dimensões. Por exemplo, no exemplo acima, Col_2_2 e Col_2_1 devem ter o mesmo número de elementos.
Devido a uma interface mais direta e ao suporte oficial a aninhamento, recomendamos flatten_nested=0.
Tipos Geo
UUID
sql.Scanner ou Stringify.
Decimal
Você pode se sentir tentado a usar Float no lugar para evitar dependências de terceiros. No entanto, saiba que os tipos Float no ClickHouse não são recomendados quando valores precisos são necessários.Se ainda assim você optar por usar o tipo Float nativo do Go no lado do cliente, deverá converter explicitamente Decimal em Float usando a função toFloat64() ou suas variantes em suas consultas no ClickHouse. Saiba que essa conversão pode resultar em perda de precisão.
Nullable
sql.Null*, por exemplo, sql.NullInt64. Eles são compatíveis com os tipos equivalentes no ClickHouse.
Inteiros grandes
BFloat16
BFloat16 é um tipo de ponto flutuante brain de 16 bits usado em cargas de trabalho de machine learning. Em Go, os valores BFloat16 são inseridos e lidos como float32. As variantes Nullable usam sql.NullFloat64.
QBit
QBit é um tipo de coluna experimental para armazenar embeddings vetoriais em formato bit-sliced, otimizado para busca por similaridade vetorial. Requer que a configuração allow_experimental_qbit_type esteja habilitada.
Em Go, uma coluna QBit(Float32, N) é inserida e lida como []float32, em que N é a dimensão do vetor.