Conversiones de tipos
Append/AppendRow) y la lectura (mediante Scan). Si necesita compatibilidad con una conversión específica, abra un issue.
La interfaz estándar database/sql debería admitir los mismos tipos que la ClickHouse API. Hay algunas excepciones, principalmente en los tipos complejos, que se documentan en las secciones siguientes. Al igual que la ClickHouse API, el cliente busca ser lo más flexible posible a la hora de aceptar tipos de variables, tanto para la inserción como para la serialización de respuestas.
Tipos complejos
Date/DateTime
Date, Date32, DateTime y DateTime64. Las fechas pueden insertarse como una cadena con el formato 2006-01-02 o mediante los tipos nativos de Go time.Time{} o sql.NullTime. Los tipos DateTime también admiten estos últimos tipos, pero las cadenas deben pasarse en el formato 2006-01-02 15:04:05, con un desplazamiento de zona horaria opcional; por ejemplo, 2006-01-02 15:04:05 +08:00. Tanto time.Time{} como sql.NullTime también se admiten en la lectura, así como cualquier implementación de la interfaz sql.Scanner.
El tratamiento de la información de zona horaria depende del tipo de ClickHouse y de si el valor se inserta o se lee:
- DateTime/DateTime64
- En el momento de insert, el valor se envía a ClickHouse en formato de marca temporal Unix. Si no se proporciona ninguna zona horaria, el cliente asumirá la zona horaria local del cliente.
time.Time{}osql.NullTimese convertirán a epoch en consecuencia. - En el momento de select, se usará la zona horaria de la columna, si está configurada, al devolver un valor
time.Time. En caso contrario, se usará la zona horaria del servidor.
- En el momento de insert, el valor se envía a ClickHouse en formato de marca temporal Unix. Si no se proporciona ninguna zona horaria, el cliente asumirá la zona horaria local del cliente.
- Date/Date32
- En el momento de insert, la zona horaria de cualquier fecha se tiene en cuenta al convertir la fecha en una marca temporal Unix; es decir, se aplicará el desplazamiento de la zona horaria antes de almacenarla como fecha, ya que los tipos
Dateno tienen configuración regional en ClickHouse. Si esto no se especifica en un valor de cadena, se usará la zona horaria local. - En el momento de select, las fechas que se lean en instancias
time.Time{}osql.NullTime{}se devolverán sin información de zona horaria.
- En el momento de insert, la zona horaria de cualquier fecha se tiene en cuenta al convertir la fecha en una marca temporal Unix; es decir, se aplicará el desplazamiento de la zona horaria antes de almacenarla como fecha, ya que los tipos
Tipos Time/Time64
Time y Time64 almacenan valores de hora del día sin componente de fecha. Ambos se corresponden con time.Duration de Go.
Timealmacena la hora con precisión de segundos.Time64(precision)admite precisión por debajo del segundo (comoDateTime64), donde la precisión va de 0 a 9.
Array
Map
Al usar la API
database/sql, los valores de tipo Map requieren un tipado estricto: no puedes usar interface{} como tipo de valor. Por ejemplo, no puedes pasar un map[string]interface{} para un campo Map(String,String); en su lugar, debes usar un map[string]string. Una variable interface{} siempre será compatible y puede usarse para estructuras más complejas.Ejemplo completoTuplas
Nested
map[string]interface{}. Actualmente, los valores no están fuertemente tipados.
flatten_tested=0
Si se usa el valor predeterminado de 1 para flatten_nested, las columnas anidadas se aplanan en arrays independientes. Esto requiere usar slices anidados para la inserción y la lectura. Aunque los niveles arbitrarios de anidación pueden funcionar, esto no tiene soporte oficial.
flatten_nested=1
Nota: Las columnas anidadas deben tener las mismas dimensiones. Por ejemplo, en el ejemplo anterior, Col_2_2 y Col_2_1 deben tener el mismo número de elementos.
Debido a que ofrece una interfaz más sencilla y soporte oficial para estructuras anidadas, recomendamos flatten_nested=0.
Tipos Geo
UUID
sql.Scanner o Stringify.
Decimal
Puede resultar tentador usar Float en su lugar para evitar dependencias de terceros. Sin embargo, tenga en cuenta que los tipos Float en ClickHouse no se recomiendan cuando se requieren valores precisos.Si aun así decide usar el tipo Float integrado de Go del lado del cliente, debe convertir Decimal a Float explícitamente mediante la función toFloat64() o sus variantes en las consultas de ClickHouse. Tenga en cuenta que esta conversión puede provocar una pérdida de precisión.
Nullable
sql.Null*, por ejemplo, sql.NullInt64. Estos son compatibles con los tipos equivalentes en ClickHouse.
Enteros grandes
BFloat16
BFloat16 es un tipo de punto flotante brain de 16 bits utilizado en cargas de trabajo de aprendizaje automático. En Go, los valores de BFloat16 se insertan y se leen como float32. Las variantes Nullable usan sql.NullFloat64.
QBit
QBit es un tipo de columna experimental para almacenar embeddings en formato bit-sliced, optimizado para la búsqueda de similitud vectorial. Requiere que la configuración allow_experimental_qbit_type esté habilitada.
En Go, una columna QBit(Float32, N) se inserta y se lee como []float32, donde N es la dimensión del vector.