Inserción de datos con ClickHouse Connect: uso avanzado
InsertContexts
InsertContext. El InsertContext incluye todos los valores enviados como argumentos al método insert del cliente. Además, cuando se crea un InsertContext, ClickHouse Connect recupera los tipos de datos de las columnas de inserción necesarios para realizar inserciones eficientes en Native format. Al reutilizar el InsertContext para varias inserciones, se evita esta “consulta previa” y las inserciones se ejecutan de forma más rápida y eficiente.
Se puede obtener un InsertContext mediante el método create_insert_context del cliente. El método acepta los mismos argumentos que la función insert. Tenga en cuenta que, para reutilizarlo, solo debe modificarse la propiedad data de los InsertContext. Esto concuerda con su propósito: proporcionar un objeto reutilizable para inserciones repetidas de datos nuevos en la misma tabla.
InsertContexts incluyen un estado mutable que se actualiza durante el proceso de inserción, así que no es seguro usarlos desde varios hilos.
Formatos de escritura
DateTime y el primer valor insertado en la columna es un entero de Python, ClickHouse Connect insertará directamente el valor entero, asumiendo que en realidad representa un segundo desde el epoch.
En la mayoría de los casos, no es necesario modificar el formato de escritura de un tipo de dato, pero los métodos asociados del paquete clickhouse_connect.datatypes.format pueden usarse para hacerlo a nivel global.
Opciones de formato de escritura
Métodos especializados de inserción
insert_df— Inserta un DataFrame de Pandas. En lugar de un argumentodatade Python de tipo Sequence of Sequences, el segundo parámetro de este método requiere un argumentodf, que debe ser una instancia de DataFrame de Pandas. ClickHouse Connect procesa automáticamente el DataFrame como un origen de datos orientado a columnas, por lo que el parámetrocolumn_orientedno es necesario ni está disponible.insert_arrow— Inserta una tabla de PyArrow. ClickHouse Connect pasa la tabla Arrow sin modificar al servidor ClickHouse para su procesamiento, por lo que, además detableyarrow_table, solo están disponibles los argumentosdatabaseysettings.insert_df_arrow— Inserta un DataFrame de Pandas respaldado por Arrow o un DataFrame de Polars. ClickHouse Connect determinará automáticamente si el DataFrame es de tipo Pandas o Polars. Si es Pandas, se realizará una validación para garantizar que el backenddtypede cada columna esté basado en Arrow, y se generará un error si alguna no lo está.
Una matriz de NumPy es una Sequence of Sequences válida y puede usarse como argumento
data con el método principal insert, por lo que no se requiere un método especializado.Inserción con DataFrame de Pandas
Inserción de tablas de PyArrow
Inserción de DataFrame respaldado por Arrow (pandas 2.x)
Zonas horarias
datetime.datetime de Python en columnas DateTime o DateTime64 de ClickHouse, ClickHouse Connect gestiona automáticamente la información de la zona horaria. Dado que ClickHouse almacena internamente todos los valores DateTime como marcas de tiempo Unix sin zona horaria (segundos o fracciones de segundo desde la época Unix), la conversión de zona horaria se realiza automáticamente en el cliente durante la inserción.
Objetos datetime con zona horaria
datetime.datetime de Python con zona horaria, ClickHouse Connect llamará automáticamente a .timestamp() para convertirlo en una marca temporal Unix, lo que tiene en cuenta correctamente el desfase de la zona horaria. Esto significa que puedes insertar objetos datetime de cualquier zona horaria y se almacenarán correctamente como su marca temporal equivalente en UTC.
Al usar pytz, debes utilizar el método
localize() para añadir la información de zona horaria a un datetime sin zona horaria. Si pasas tzinfo= directamente al constructor de datetime, se usarán desplazamientos históricos incorrectos. En el caso de UTC, tzinfo=pytz.UTC funciona correctamente. Consulta la documentación de pytz para obtener más información.Objetos datetime sin zona horaria
datetime.datetime de Python sin zona horaria (es decir, sin tzinfo), el método .timestamp() lo interpretará como si estuviera en la zona horaria local del sistema. Para evitar ambigüedades, se recomienda:
- Usar siempre objetos datetime con zona horaria al insertar, o
- Asegurarte de que la zona horaria del sistema esté configurada en UTC, o
- Convertirlos manualmente a timestamps de epoch antes de insertarlos
Columnas DateTime con metadatos de zona horaria
DateTime('America/Denver') o DateTime64(3, 'Asia/Tokyo')). Estos metadatos no afectan a cómo se almacenan los datos (siguen siendo timestamps UTC), pero determinan la zona horaria que se usa al consultar los datos de nuevo desde ClickHouse.
Al insertar en estas columnas, ClickHouse Connect convierte tu objeto datetime de Python en una marca temporal Unix (teniendo en cuenta su zona horaria, si la tiene). Cuando vuelvas a consultar los datos, ClickHouse Connect devolverá el datetime convertido a la zona horaria de la columna, independientemente de la zona horaria que hayas usado al insertar.
Inserciones desde archivos
clickhouse_connect.driver.tools incluye el método insert_file, que permite insertar datos directamente desde el sistema de archivos en una tabla de ClickHouse existente. El análisis se delega en el servidor de ClickHouse. insert_file acepta los siguientes parámetros:
Para archivos con datos incoherentes o valores de fecha/hora en un formato inusual, este método reconoce los settings aplicables a las importaciones de datos (como
input_format_allow_errors_num y input_format_allow_errors_num).