Conexión
default.
Tenga en cuenta que usamos el puerto nativo predeterminado para conectarnos.
conn de ClickHouse ya se ha creado y está disponible.
Ejecución
Exec. Esto resulta útil para DDL y sentencias simples. No debe usarse para inserciones de gran volumen ni para iteraciones sobre consultas.
Inserción por lotes
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.
Columnas efímeras
Consultar filas
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.
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
Inserción columnar
Uso de structs
Select con serialización
Scan struct
ScanStruct permite mapear una sola fila de una consulta a una struct.
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.
Vinculación de parámetros
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.
Casos especiales
[ ], 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.
Uso del contexto
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.
Información de Progress, Profile y Log
Escaneo dinámico
Tablas externas
ext.NewTable antes de pasarla a través del contexto.
OpenTelemetry
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.