Descripción general
- Usa
serdepara codificar y decodificar filas. - Admite atributos de
serde:skip_serializing,skip_deserializing,rename. - Usa el formato
RowBinarya través del transporte HTTP.- Está previsto cambiar a
Nativesobre TCP.
- Está previsto cambiar a
- Admite TLS (mediante las features
native-tlsyrustls-tls). - Admite compresión y descompresión (LZ4).
- Proporciona APIs para consultar o insertar datos, ejecutar DDLs y realizar procesamiento por lotes en el cliente.
- Proporciona mocks útiles para pruebas unitarias.
Instalación
Cargo.toml:
Funcionalidades de Cargo
lz4(habilitada de forma predeterminada) — habilita las variantesCompression::Lz4yCompression::Lz4Hc(_). Si está habilitada,Compression::Lz4se usa de forma predeterminada para todas las consultas exceptoWATCH.native-tls— admite URL con el esquemaHTTPSmediantehyper-tls, que se enlaza con OpenSSL.rustls-tls— admite URL con el esquemaHTTPSmediantehyper-rustls, que no se enlaza con OpenSSL.inserter— habilitaclient.inserter().test-util— añade mocks. Consulta el ejemplo. Úsalo solo endev-dependencies.watch— habilita la funcionalidadclient.watch. Consulta la sección correspondiente para obtener más información.uuid— añadeserde::uuidpara trabajar con el crate uuid.time— añadeserde::timepara trabajar con el crate time.
Compatibilidad de versiones de ClickHouse
wa-37420 para resolver este problema. Nota: esta feature no debe usarse con versiones más recientes de ClickHouse.
Ejemplos
Uso
El crate ch2rs es útil para generar un tipo de fila desde ClickHouse.
Creación de una instancia de cliente
Conexión HTTPS o a ClickHouse Cloud
rustls-tls o native-tls.
A continuación, cree el cliente como de costumbre. En este ejemplo, se usan variables de entorno para almacenar los datos de conexión:
- ejemplo de HTTPS con ClickHouse Cloud en el repositorio del cliente. También debería ser aplicable a las conexiones HTTPS locales.
Seleccionar filas
- El marcador de posición
?fieldsse reemplaza porno, name(campos deRow). - El marcador de posición
?se reemplaza por los valores de las siguientes llamadas abind(). - Se pueden usar los prácticos métodos
fetch_one::<Row>()yfetch_all::<Row>()para obtener la primera fila o todas las filas, respectivamente. sql::Identifierpuede usarse para pasar nombres de tabla.
query(...).with_option("wait_end_of_query", "1") para habilitar el búfer de respuesta en el servidor. Más detalles. La opción buffer_size también puede ser útil.
Inserción de filas
- Si no se llama a
end(), elINSERTse aborta. - Las filas se envían progresivamente como un flujo para repartir la carga de red.
- ClickHouse inserta lotes de forma atómica solo si todas las filas caben en la misma partición y su número es menor que
max_insert_block_size.
Inserción asíncrona (agrupación en lotes en el servidor)
async_insert al método insert (o incluso a la propia instancia de Client, para que afecte a todas las llamadas a insert).
- Ejemplo de async insert en el repositorio del cliente.
Funcionalidad Inserter (agrupación por lotes en el cliente)
inserter de Cargo.
Inserterfinaliza la operación de insert activa encommit()si se alcanza cualquiera de los umbrales (max_bytes,max_rows,period).- El intervalo entre el cierre de
INSERTactivos puede ajustarse conwith_period_biaspara evitar picos de carga provocados por insertores en paralelo. Inserter::time_left()puede usarse para detectar cuándo termina el período actual. Vuelve a llamar aInserter::commit()para comprobar los límites si tu flujo emite elementos con poca frecuencia.- Los umbrales de tiempo se implementan con el crate quanta para acelerar
inserter. No se usa sitest-utilestá habilitado (por lo tanto, el tiempo puede gestionarse contokio::time::advance()en pruebas personalizadas). - Todas las filas entre llamadas a
commit()se insertan en la misma sentenciaINSERT.
Ejecución de DDLs
wait_end_of_query. Esto puede hacerse así:
Ajustes de ClickHouse
with_option. Por ejemplo:
query, funciona de forma similar con los métodos insert e inserter; asimismo, se puede llamar al mismo método en la instancia Client para establecer la configuración global para todas las consultas.
ID de consulta
.with_option, puede establecer la opción query_id para identificar consultas en el log de consultas de ClickHouse.
query, funciona de manera similar con los métodos insert e inserter.
Si establece
query_id manualmente, asegúrese de que sea único. Los UUIDs son una buena opción para ello.ID de sesión
query_id, puedes establecer session_id para ejecutar las sentencias en la misma sesión. session_id puede establecerse de forma global a nivel de cliente, o en cada llamada a query, insert o inserter.
En los despliegues en clúster, debido a la falta de “sesiones persistentes”, debes estar conectado a un nodo concreto del clúster para poder utilizar esta función correctamente, ya que, por ejemplo, un balanceador de carga round-robin no garantiza que las solicitudes posteriores las procese el mismo nodo de ClickHouse.
Cabeceras HTTP personalizadas
Cliente HTTP personalizado
Tipos de datos
Consulte también estos ejemplos adicionales:
(U)Int(8|16|32|64|128)se corresponde con los tipos(u|i)(8|16|32|64|128)equivalentes, tanto de ida como de vuelta, o con newtypes basados en ellos.(U)Int256no es compatible directamente, pero hay una solución alternativa.Float(32|64)se corresponde conf(32|64)equivalentes, tanto de ida como de vuelta, o con newtypes basados en ellos.Decimal(32|64|128)se corresponde coni(32|64|128)equivalentes, tanto de ida como de vuelta, o con newtypes basados en ellos. Es más práctico usarfixnumu otra implementación de números de punto fijo con signo.Booleanse corresponde conbool, tanto de ida como de vuelta, o con newtypes basados en él.Stringse corresponde con cualquier tipo de cadena o bytes, tanto de ida como de vuelta; por ejemplo,&str,&[u8],String,Vec<u8>oSmartString. También se admiten newtypes. Para almacenar bytes, considere usarserde_bytes, ya que es más eficiente.
FixedString(N)se admite como un arreglo de bytes, p. ej.,[u8; N].
Enum(8|16)se admite medianteserde_repr.
UUIDse mapea a/desdeuuid::Uuidmedianteserde::uuid. Requiere la funcionalidaduuid.
IPv6se mapea a/desdestd::net::Ipv6Addr.IPv4se mapea a/desdestd::net::Ipv4Addrusandoserde::ipv4.
Datese convierte desde y haciau16, o un newtype basado en él, y representa un número de días transcurridos desde1970-01-01. Además,time::Datetambién es compatible medianteserde::time::date, lo que requiere la funcionalidadtime.
Date32se convierte desde y haciai32, o un newtype basado en este, y representa una cantidad de días transcurridos desde1970-01-01. Además,time::Datees compatible usandoserde::time::date32, lo que requiere la funcionalidadtime.
DateTimese convierte desde y haciau32o un newtype basado en este, y representa una cantidad de segundos transcurridos desde la época Unix. Además,time::OffsetDateTimees compatible medianteserde::time::datetime, lo que requiere la featuretime.
DateTime64(_)se puede mapear desde y haciai32o unnewtypebasado en él, y representa el tiempo transcurrido desde la época de Unix. Además,time::OffsetDateTimees compatible medianteserde::time::datetime64::*, lo que requiere la funcionalidadtime.
Tuple(A, B, ...)se mapea a/desde(A, B, ...)o a un newtype basado en este.Array(_)se mapea a/desde cualquier slice, p. ej.,Vec<_>,&[_]. También se admiten tipos nuevos.Map(K, V)se comporta comoArray((K, V)).LowCardinality(_)se admite de forma transparente.Nullable(_)se mapea a/desdeOption<_>. Para los helpersclickhouse::serde::*, añade::option.
Nestedes compatible al proporcionar varios arrays renombrados.
- Se admiten tipos
Geo.Pointse comporta como una tupla(f64, f64), y el resto de los tipos no son más que secuencias de puntos.
- Los tipos de datos
Variant,Dynamic, (nuevo)JSONtodavía no se admiten.
Simulación
SELECT, INSERT y WATCH. Esta funcionalidad se puede habilitar con la funcionalidad test-util. Úsela solo como dependencia de desarrollo.
Consulte el ejemplo.
Solución de problemas
CANNOT_READ_ALL_DATA
CANNOT_READ_ALL_DATA es que la definición de la fila en la aplicación no coincide con la de ClickHouse.
Considere la siguiente tabla:
EventLog está definido en la aplicación con tipos que no coinciden, por ejemplo:
EventLog:
Limitaciones conocidas
- Los tipos de datos
Variant,DynamicyJSON(nuevo) todavía no se admiten. - La vinculación de parámetros del lado del servidor todavía no se admite; consulta esta incidencia para seguir su estado.