Saltar al contenido principal
Todos los ejemplos de código de la API de ClickHouse se pueden encontrar aquí. Para la configuración de la conexión, consulta Configuración. Para ver los tipos de datos compatibles y las correspondencias de tipos de Go, consulta Tipos de datos.

Conexión

El siguiente ejemplo, que devuelve la versión del servidor, muestra cómo conectarse a ClickHouse, suponiendo que ClickHouse no está protegido y que se puede acceder con el usuario default. Tenga en cuenta que usamos el puerto nativo predeterminado para conectarnos.
Ejemplo completo En todos los ejemplos siguientes, salvo que se indique explícitamente lo contrario, asumimos que la variable conn de ClickHouse ya se ha creado y está disponible.

Ejecución

Se pueden ejecutar sentencias arbitrarias mediante el método Exec. Esto resulta útil para DDL y sentencias simples. No debe usarse para inserciones de gran volumen ni para iteraciones sobre consultas.
Ejemplo completo Tenga en cuenta que puede pasar un Context a la consulta. Esto puede usarse para pasar configuraciones específicas a nivel de consulta; consulte Using Context.

Inserción por lotes

Para insertar un gran número de filas, el cliente ofrece semántica de lotes. Para ello, es necesario preparar un lote al que se puedan añadir filas. Finalmente, se envía mediante el método Send(). Los lotes se mantienen en memoria hasta que se ejecuta Send. Se recomienda llamar a Close en el lote para evitar fugas de conexiones. Esto puede hacerse mediante la palabra clave defer después de preparar el lote. Así se limpiará la conexión si nunca se llega a llamar a Send. Ten en cuenta que esto hará que aparezcan 0 inserciones de filas en el registro de consultas si no se añadió ninguna fila.
Ejemplo completo Las recomendaciones para ClickHouse pueden consultarse aquí. Los lotes no deben compartirse entre go-routines; cree un lote independiente por rutina. En el ejemplo anterior, observe que los tipos de las variables deben coincidir con el tipo de la columna al agregar filas. Aunque la correspondencia suele ser evidente, esta interfaz intenta ser flexible y convertirá los tipos siempre que no se produzca pérdida de precisión. Por ejemplo, a continuación se muestra cómo insertar una cadena en un datetime64.
Ejemplo completo Para ver un resumen completo de los tipos de Go compatibles con cada tipo de columna, consulte Conversiones de tipos.

Columnas efímeras

Las columnas efímeras son columnas de solo escritura que existen únicamente durante la inserción: no se almacenan ni se pueden seleccionar. Son útiles para calcular valores de columnas derivadas en el momento de la inserción.
Ejemplo completo

Consultar filas

Puede consultar una sola fila con el método QueryRow u obtener un cursor para iterar sobre un conjunto de resultados con Query. Mientras que el primero acepta un destino en el que serializar los datos, el segundo requiere llamar a Scan en cada fila.
Ejemplo completo
Ejemplo completo Tenga en cuenta que, en ambos casos, es necesario pasar un puntero a las variables en las que queremos serializar los valores de las columnas correspondientes. Estas deben pasarse en el orden especificado en la instrucción SELECT; de forma predeterminada, en el caso de un SELECT * se utilizará el orden de declaración de las columnas, como se muestra arriba. Al igual que en la inserción, el método Scan requiere que las variables de destino sean de un tipo adecuado. De nuevo, se busca ofrecer flexibilidad, convirtiendo tipos cuando sea posible, siempre que no haya pérdida de precisión; por ejemplo, el ejemplo anterior muestra una columna UUID leída en una variable de tipo string. Para obtener una lista completa de los tipos de Go compatibles con cada tipo de columna, consulte Type Conversions. Por último, tenga en cuenta la posibilidad de pasar un Context a los métodos Query y QueryRow. Esto puede usarse para configuraciones a nivel de consulta; consulte Using Context para obtener más detalles.

Insert asíncrono

Las inserciones asíncronas son compatibles mediante el método Async. Esto permite al usuario especificar si el cliente debe esperar a que el servidor complete la inserción o si debe responder una vez recibidos los datos. Esto controla de forma efectiva el parámetro wait_for_async_insert.
Ejemplo completo

Inserción columnar

Las inserciones pueden hacerse en formato columnar. Esto puede aportar ventajas de rendimiento si los datos ya están organizados de esta forma, ya que evita tener que convertirlos en filas.
Ejemplo completo

Uso de structs

Para los usuarios, los structs de Golang proporcionan una representación lógica de una fila de datos en ClickHouse. Para ayudar con esto, la interfaz nativa proporciona varias funciones prácticas.

Select con serialización

El método Select permite convertir un conjunto de filas de respuesta en un slice de structs con una sola llamada.
Ejemplo completo

Scan struct

ScanStruct permite mapear una sola fila de una consulta a una struct.
Ejemplo completo

Añadir struct

AppendStruct permite añadir una struct a un lote existente e interpretarla como una fila completa. Para ello, las columnas de la struct deben coincidir con la tabla tanto en nombre como en tipo. Aunque todas las columnas deben tener un campo equivalente en la struct, puede que algunos campos de la struct no tengan una columna equivalente. Estos simplemente se ignorarán.
Ejemplo completo

Vinculación de parámetros

El cliente admite la vinculación de parámetros en los métodos Exec, Query y QueryRow. Como se muestra en el siguiente ejemplo, se admite el uso de parámetros con nombre, numerados y posicionales. A continuación se muestran ejemplos de cada uno.
Ejemplo completo

Casos especiales

De forma predeterminada, los slices se expanden en una lista de valores separados por comas si se pasan como parámetro a una consulta. Si necesita que un conjunto de valores se inserte entre corchetes [ ], debe usar ArraySet. Si se requieren grupos/tuplas, entre paréntesis ( ), por ejemplo, para usarlos con operadores IN, puede usar GroupSet. Esto resulta especialmente útil cuando se requieren varios grupos, como se muestra en el ejemplo siguiente. Por último, los campos DateTime64 requieren precisión para garantizar que los parámetros se representen correctamente. Sin embargo, el cliente desconoce el nivel de precisión del campo, por lo que el usuario debe proporcionarlo. Para facilitarlo, proporcionamos el parámetro DateNamed.
Ejemplo completo

Uso del contexto

Los contextos de Go proporcionan una forma de pasar fechas límite, señales de cancelación y otros valores asociados a una solicitud a través de los límites de la API. Todos los métodos de una conexión aceptan un contexto como primer parámetro. Aunque en los ejemplos anteriores se usó context.Background(), puede usar esta capacidad para pasar configuraciones y fechas límite, así como para cancelar consultas. Pasar un contexto creado con withDeadline permite establecer límites de tiempo de ejecución en las consultas. Tenga en cuenta que se trata de un instante absoluto y que su vencimiento solo liberará la conexión y enviará una señal de cancelación a ClickHouse. Como alternativa, puede usarse WithCancel para cancelar una consulta explícitamente. Los auxiliares clickhouse.WithQueryID y clickhouse.WithQuotaKey permiten especificar un identificador de consulta y una clave de cuota. Los identificadores de consulta pueden ser útiles para rastrear consultas en los registros y con fines de cancelación. Se puede usar una clave de cuota para imponer límites al uso de ClickHouse en función de un valor de clave único; consulte Quotas Management para obtener más información. También puede usar el contexto para asegurarse de que una configuración solo se aplique a una consulta específica, en lugar de a toda la conexión, como se muestra en Connection Settings. Por último, puede controlar el tamaño del búfer de bloques mediante clickhouse.WithBlockSize. Esto anula la configuración de nivel de conexión BlockBufferSize y controla el número máximo de bloques que se decodifican y se mantienen en memoria en un momento dado. Los valores más altos pueden permitir una mayor paralelización, a costa de un mayor uso de memoria. A continuación se muestran ejemplos de lo anterior.
Ejemplo completo

Información de Progress, Profile y Log

Se puede solicitar información de Progress, Profile y Log en las consultas. La información de Progress muestra estadísticas sobre la cantidad de filas y bytes leídos y procesados en ClickHouse. En cambio, la información de Profile ofrece un resumen de los datos devueltos al cliente, incluidos los totales de bytes (sin comprimir), filas y bloques. Por último, la información de Log proporciona estadísticas sobre los hilos, por ejemplo, el uso de memoria y la velocidad de procesamiento de los datos. Para obtener esta información, es necesario que el usuario use Context, al que puede pasar funciones de callback.
Ejemplo completo

Escaneo dinámico

Puede que necesite leer tablas cuyo esquema o tipo de los campos devueltos se desconozca. Esto es habitual cuando se realiza análisis de datos ad hoc o se desarrollan herramientas genéricas. Para ello, la información sobre los tipos de las columnas está disponible en las respuestas a las consultas. Esto puede usarse con la reflexión de Go para crear instancias en tiempo de ejecución de variables con los tipos correctos que pueden pasarse a Scan.
Ejemplo completo

Tablas externas

Las tablas externas permiten al cliente enviar datos a ClickHouse junto con una consulta SELECT. Estos datos se colocan en una tabla temporal y pueden usarse en la propia consulta para evaluarlos. Para enviar datos externos al cliente con una consulta, el usuario debe crear una tabla externa mediante ext.NewTable antes de pasarla a través del contexto.
Ejemplo completo

OpenTelemetry

ClickHouse admite la propagación del contexto de trazas tanto en los transportes TCP como HTTP. Cuando se usa TCP, el cliente serializa el span en el protocolo binario nativo. Usa clickhouse.WithSpan para adjuntar un span a una consulta mediante el contexto.
Limitación del transporte HTTPAunque el servidor de ClickHouse acepta las cabeceras HTTP estándar traceparent / tracestate, el transporte HTTP de clickhouse-go actualmente no las envía, por lo que WithSpan no tiene efecto en HTTP. Como alternativa, puedes configurar manualmente la cabecera mediante HttpHeaders en las opciones de conexión.
Ejemplo completo Puedes encontrar todos los detalles sobre cómo aprovechar el tracing en la compatibilidad con OpenTelemetry.
Última modificación el 29 de junio de 2026