Conversions de types
Append/AppendRow) et la lecture (via un Scan). Si vous avez besoin de la prise en charge d’une conversion spécifique, veuillez ouvrir une issue.
L’interface standard database/sql doit prendre en charge les mêmes types que la ClickHouse API. Il existe quelques exceptions, principalement pour les types complexes, qui sont documentées dans les sections ci-dessous. Comme avec la ClickHouse API, le client se veut aussi flexible que possible quant aux types de variables acceptés, aussi bien pour l’insertion que pour la sérialisation des réponses.
Types complexes
Date/DateTime
Date, Date32, DateTime et DateTime64. Les dates peuvent être insérées sous forme de chaîne au format 2006-01-02, ou à l’aide des types Go natifs time.Time{} ou sql.NullTime. Les types DateTime prennent également en charge ces derniers, mais les chaînes doivent alors être transmises au format 2006-01-02 15:04:05, avec un décalage de fuseau horaire facultatif, par exemple 2006-01-02 15:04:05 +08:00. time.Time{} et sql.NullTime sont également pris en charge à la lecture, ainsi que toute implémentation de l’interface sql.Scanner.
La gestion des informations de fuseau horaire dépend du type ClickHouse et du fait que la valeur soit insérée ou lue :
- DateTime/DateTime64
- À l’insertion, la valeur est envoyée à ClickHouse au format de timestamp Unix. Si aucun fuseau horaire n’est fourni, le client utilisera par défaut son fuseau horaire local.
time.Time{}ousql.NullTimeseront convertis en époque Unix en conséquence. - À la lecture, le fuseau horaire de la colonne sera utilisé s’il est défini lors du renvoi d’une valeur
time.Time. Sinon, le fuseau horaire du serveur sera utilisé.
- À l’insertion, la valeur est envoyée à ClickHouse au format de timestamp Unix. Si aucun fuseau horaire n’est fourni, le client utilisera par défaut son fuseau horaire local.
- Date/Date32
- À l’insertion, le fuseau horaire de toute date est pris en compte lors de la conversion de la date en timestamp Unix, c’est-à-dire qu’un décalage correspondant au fuseau horaire est appliqué avant le stockage sous forme de date, car les types Date n’ont pas de paramètre régional dans ClickHouse. Si ce fuseau n’est pas indiqué dans une valeur chaîne, le fuseau horaire local sera utilisé.
- À la lecture, les dates lues dans des instances
time.Time{}ousql.NullTime{}seront renvoyées sans information de fuseau horaire.
Types Time/Time64
Time et Time64 stockent des valeurs d’heure sans composante de date. Tous deux correspondent à time.Duration en Go.
Timestocke l’heure avec une précision à la seconde.Time64(precision)prend en charge une précision inférieure à la seconde (commeDateTime64), où la précision va de 0 à 9.
Array
Map
Avec l’API database/sql, les valeurs de type Map doivent être strictement typées : vous ne pouvez pas utiliser
interface{} comme type de valeur. Par exemple, vous ne pouvez pas passer un map[string]interface{} pour un champ Map(String,String) ; vous devez utiliser un map[string]string à la place. En revanche, une variable interface{} sera toujours compatible et peut être utilisée pour des structures plus complexes.Exemple completTuples
Nested
map[string]interface{}. Les valeurs ne sont actuellement pas fortement typées.
flatten_tested=0
Si la valeur par défaut de 1 est utilisée pour flatten_nested, les colonnes imbriquées sont aplaties en tableaux séparés. Cela nécessite l’utilisation de slices imbriquées pour l’insertion et la lecture. Bien que des niveaux d’imbrication arbitraires puissent fonctionner, cela n’est pas officiellement pris en charge.
flatten_nested=1
Remarque : les colonnes Nested doivent avoir les mêmes dimensions. Par exemple, dans l’exemple ci-dessus, Col_2_2 et Col_2_1 doivent contenir le même nombre d’éléments.
Grâce à une interface plus simple et à la prise en charge officielle de l’imbrication, nous recommandons flatten_nested=0.
Types géo
UUID
sql.Scanner ou Stringify.
Decimal
Vous pourriez être tenté d’utiliser Float à la place afin d’éviter des dépendances tierces. Toutefois, gardez à l’esprit que les types Float dans ClickHouse ne sont pas recommandés lorsque des valeurs exactes sont nécessaires.Si vous choisissez malgré tout d’utiliser le type Float intégré de Go côté client, vous devez convertir explicitement Decimal en Float à l’aide de la fonction toFloat64() ou de ses variantes dans vos requêtes ClickHouse. Gardez à l’esprit que cette conversion peut entraîner une perte de précision.
Nullable
sql.Null*, par exemple sql.NullInt64. Ils sont compatibles avec les types ClickHouse équivalents.
Grands entiers
BFloat16
BFloat16 est un type à virgule flottante brain sur 16 bits utilisé dans les charges de travail de machine learning. En Go, les valeurs BFloat16 sont insérées et lues comme des float32. Les variantes Nullable utilisent sql.NullFloat64.
QBit
QBit est un type de colonne expérimental permettant de stocker des représentations vectorielles au format bit-sliced, optimisé pour la recherche de similarité vectorielle. Il nécessite que le paramètre allow_experimental_qbit_type soit activé.
En Go, une colonne QBit(Float32, N) est insérée et lue sous forme de []float32, où N est la dimension du vecteur.