선택적 매개변수가 많은 클라이언트 팩터리와 메서드에서는 키워드 인수를 사용하십시오.여기에 문서화되지 않은 메서드는 API의 일부로 간주되지 않으며, 제거되거나 변경될 수 있습니다.
클라이언트 초기화
Client를 생성하려면 clickhouse_connect.get_client를 사용하십시오. 네이티브 AsyncClient를 생성하려면 async extra를 설치한 후 clickhouse_connect.get_async_client를 await하십시오.
연결 인수
비동기 팩토리에서는 aiohttp 연결 풀을 구성하기 위해
connector_limit=100, connector_limit_per_host=20, keepalive_timeout=30.0도 사용할 수 있습니다. pool_mgr는 사용할 수 없습니다. 동기식 chDB 백엔드에서는 path와 chdb_options를 사용할 수 있습니다. 자세한 내용은 내장 chDB 백엔드를 참조하십시오.
HTTPS/TLS 인수
설정 인수
get_client의 settings 인수는 각 클라이언트 요청마다 추가 ClickHouse 설정을 서버에 전달하는 데 사용됩니다. 대부분의 경우 readonly=1 권한을 가진 사용자는 쿼리와 함께 전송된 설정을 변경할 수 없으므로, ClickHouse Connect는 최종 요청에서 이러한 설정을 제외하고 경고를 기록합니다. 다음 설정은 ClickHouse Connect에서 사용하는 HTTP 쿼리/세션에만 적용되며, 일반적인 ClickHouse 설정으로 문서화되어 있지 않습니다.
각 쿼리와 함께 전송할 수 있는 다른 ClickHouse 설정은 ClickHouse 문서를 참조하십시오.
클라이언트 생성 예시
- 매개변수를 지정하지 않으면 ClickHouse Connect 클라이언트는
localhost의 기본 HTTP 포트에default사용자로 비밀번호 없이 연결됩니다:
- 보안(HTTPS)을 사용하는 외부 ClickHouse 서버에 연결
- 세션 ID와 기타 사용자 지정 연결 매개변수, ClickHouse 설정을 사용해 연결합니다.
내장 chDB 백엔드
clickhouse-connect[chdb]를 설치하십시오. 이 백엔드는 동기식 클라이언트의 쿼리, 삽입, 스트리밍 및 Arrow 메서드를 제공합니다:
path="/data/my_chdb"를 지정하거나 dsn="chdb:///data/my_chdb"를 사용하십시오. 백엔드는 프로세스당 하나의 엔진 경로만 허용하며 get_async_client 또는 외부 데이터를 지원하지 않습니다.
클라이언트 수명 주기와 모범 사례
핵심 원칙
- 클라이언트 재사용: 애플리케이션 시작 시 클라이언트를 한 번만 생성하고, 애플리케이션이 실행되는 동안 계속 재사용합니다
- 빈번한 생성 방지: 각 쿼리나 요청마다 새 클라이언트를 생성하지 마십시오
- 적절한 정리: 종료할 때는 연결 풀 리소스를 해제할 수 있도록 항상 클라이언트를 닫으십시오
- 가능하면 공유: 단일 클라이언트는 연결 풀을 통해 많은 동시 쿼리를 처리할 수 있습니다(아래의 스레딩 참고 사항 참조)
기본 패턴
멀티스레드 애플리케이션
올바른 정리
client.close()는 클라이언트가 자체 풀 관리자(pool manager)를 소유한 경우에만(예: 사용자 지정 TLS/프록시 옵션으로 생성된 경우) 클라이언트를 정리하고 풀링된 HTTP 연결을 닫습니다. 이 점에 유의하십시오. 기본 공유 풀에서는 client.close_connections()를 사용해 소켓을 미리 정리하십시오. 그렇지 않으면 연결은 idle 만료 시점이나 프로세스 종료 시 자동으로 회수됩니다.
여러 클라이언트를 사용해야 하는 경우
- 서로 다른 서버: ClickHouse 서버 또는 클러스터마다 클라이언트를 1개씩 사용
- 서로 다른 자격 증명: 서로 다른 사용자 또는 접근 수준별로 별도의 클라이언트 사용
- 서로 다른 데이터베이스: 여러 데이터베이스에서 작업해야 하는 경우
- 격리된 세션: 임시 테이블 또는 세션별 설정을 위해 별도의 세션이 필요한 경우
- 스레드별 격리: 스레드마다 독립적인 세션이 필요한 경우(위 예시 참조)
공통 메서드 인수
parameters 및 settings 인수 중 하나 또는 둘 다를 사용합니다. 이러한 키워드 인수는 아래에서 설명합니다.
매개변수 인수
query* 및 command 메서드는 Python 표현식을 ClickHouse 값 표현식에 바인딩하는 데 사용하는 선택적 키워드 인수 parameters를 지원합니다. 바인딩은 두 가지 방식으로 사용할 수 있습니다.
서버 측 바인딩
{<name>:<datatype>} 형식의 표현식이 감지되면 이 모드를 사용합니다. 값은 Python 딕셔너리로 전달하십시오.
널 허용 값에는 Python None을 사용하십시오. 중첩된 None 값은 Array 및 Tuple 매개변수 내부와 dict_parameter_format이 "map"으로 설정된 경우 Map 리터럴 내부에서 지원됩니다.
- Python 딕셔너리, DateTime 값, 문자열 값을 사용하는 서버 측 바인딩
클라이언트 측 바인딩
parameters 인수가 딕셔너리 또는 시퀀스여야 합니다. 클라이언트 측 바인딩은 매개변수 치환을 위해 Python의 “printf” 스타일 문자열 포맷팅을 사용합니다.
서버 측 바인딩과 달리 클라이언트 측 바인딩은 데이터베이스, 테이블, 컬럼 이름과 같은 데이터베이스 식별자에는 사용할 수 없습니다. Python 스타일 포맷팅은 서로 다른 문자열 타입을 구분하지 못하며, 이러한 값은 서로 다른 방식으로 포맷팅해야 하기 때문입니다(데이터베이스 식별자에는 backticks 또는 큰따옴표를 사용하고, 데이터 값에는 작은따옴표를 사용).
- Python 딕셔너리, DateTime 값, 문자열 이스케이프를 사용하는 예시
- Python 시퀀스(Tuple), Float64, IPv4Address 사용 예시
Datetime 바인딩은 naive 값을 wall time으로 처리합니다. 클라이언트는 naive 이전 버전과의 호환성을 위해, 딕셔너리 매개변수 이름이
datetime을 그대로 포맷합니다. ClickHouse는 {dt:DateTime('Europe/Berlin')}와 같은 서버 측 플레이스홀더에 선언된 시간대를 사용해 이를 해석하고, 없으면 설정된 session_timezone을 사용하며, 그마저 없으면 서버 시간대를 사용합니다. 시간대 인식 datetime은 플레이스홀더에 시간대가 선언되어 있으면 해당 시간대로 변환되고, 그렇지 않으면 연결 시 보고된 서버 시간대로 변환됩니다. session_timezone 설정이 보고된 서버 시간대와 다르면, 시간대 인식 값에서 의도한 시점을 유지하도록 플레이스홀더에 시간대를 선언하십시오.이전 호스트 로컬 변환과의 임시 호환성을 위해 매개변수를 바인딩하기 전에 common.set_setting("naive_datetime_binding", "legacy")를 설정하십시오. 시점을 보존하려면 datetime 값을 매개변수로 전달하기 전에 의도한 tzinfo를 지정하십시오. client.insert를 통한 삽입은 기본적으로 naive datetime 값을 프로세스 로컬 시간대로 해석합니다. 컬럼 시간대의 wall time으로 해석하려면 전역 naive_datetime_insert 설정을 "server"로 지정하십시오. 컬럼에 시간대가 없으면 서버 시간대를 사용합니다. 시간대 정보가 없는 datetime 객체를 참조하십시오.서버 측 {value:DateTime64(precision)} 플레이스홀더의 경우 선언된 유형이 Array 및 Tuple 힌트 내부를 포함해 초 미만 정밀도를 자동으로 유지합니다.클라이언트 측 %s 바인딩에는 선언된 유형이 없습니다. 초 미만 정밀도로 렌더링해야 하는 경우 datetime을 DT64Param으로 감싸십시오:_64로 끝나는 경우에도 쿼리에 정확히 그 접미사가 붙은 이름이 없으면 DateTime64 포맷팅을 요청합니다.datetime.time 또는 datetime.timedelta 매개변수는 두 바인딩 스타일 모두에서, 그리고 Array 및 Tuple 값 내부에서 ClickHouse Time 및 Time64 컬럼용 [-]HH:MM:SS[.ffffff] 리터럴로 포맷됩니다. 클라이언트가 따옴표를 추가하므로 쿼리에서 플레이스홀더를 따옴표로 묶지 마십시오. timedelta는 음수일 수 있으며 24시간을 초과할 수 있습니다. pandas Timedelta는 나노초를 유지하며 Time64(9)에 대해 9자리 소수 부분으로 포맷됩니다. ClickHouse Time에는 시간대가 없으므로 시간대 인식 time의 시간대 정보는 무시됩니다.설정 인수
settings 키워드 인수를 지원합니다. settings 인수는 딕셔너리여야 합니다. 각 항목은 ClickHouse 설정 이름과 해당 값으로 이루어져야 합니다. 값은 서버로 쿼리 매개변수로 전송될 때 문자열로 변환된다는 점에 유의하십시오.
클라이언트 수준 설정과 마찬가지로, ClickHouse Connect는 서버가 readonly=1로 표시한 설정을 관련 로그 메시지와 함께 모두 제외합니다. ClickHouse HTTP 인터페이스를 통한 쿼리에만 적용되는 설정은 항상 유효합니다. 이러한 설정은 get_client API에서 설명합니다.
ClickHouse 설정 사용 예시:
Client command 메서드
Client.command를 사용합니다. 응답에 따라 문자열, 정수, 문자열 시퀀스 또는 QuerySummary를 반환합니다. 빈 결과 집합을 생성하는 읽기 작업은 빈 문자열을 반환합니다.
명령 예시
DDL 문
단일 값을 반환하는 간단한 쿼리
매개변수를 사용하는 명령
설정이 포함된 명령
Client query 메서드
Client.query는 ClickHouse Native 형식의 테이블형 데이터셋을 가져와 QueryResult를 반환합니다. 결과 속성에 접근하는 시점에 전체 결과가 구체화됩니다. 메모리에 보관하지 않아야 하는 결과에는 스트리밍 메서드를 사용하세요.
쿼리 예시
기본 쿼리
쿼리 결과 조회하기
클라이언트 측 매개변수를 사용한 쿼리
서버 측 매개변수를 사용하는 쿼리
설정을 지정한 쿼리
QueryResult 객체
query 메서드는 다음 공개 속성을 포함하는 QueryResult 객체를 반환합니다.
result_rows— 행 기준으로 구성된 결과 매트릭스입니다.result_columns— 컬럼 기준으로 구성된 결과 매트릭스입니다.result_set— 쿼리 방향에 따라result_rows또는result_columns입니다.column_names— 결과 컬럼명의Tuple입니다.column_types—ClickHouseType객체의Tuple입니다.row_count— 구체화된 결과 행 수입니다.query_id— 요청에 대해 보고되었거나 생성된 쿼리 ID입니다. 빈 문자열은 사용 가능한 값이 없었음을 의미합니다.summary—X-ClickHouse-Summary응답 헤더에서 디코딩된 딕셔너리입니다.first_item— 딕셔너리 형식의 첫 번째 행이며, 결과가 비어 있으면None입니다.first_row— 시퀀스 형식의 첫 번째 행이며, 결과가 비어 있으면None입니다.column_block_stream,row_block_stream,rows_stream— 내부 스트림 컨텍스트입니다. 대신 해당 클라이언트의 스트리밍 메서드를 사용하십시오.
StreamContext API는 스트리밍 쿼리에서 확인하십시오.
NumPy, Pandas 또는 Arrow로 쿼리 결과 처리하기
클라이언트 스트리밍 쿼리 메서드
클라이언트 insert 메서드
Client.insert 메서드를 사용합니다. 이 메서드는 다음 매개변수를 받습니다.
이 메서드는
QuerySummary를 반환합니다. 이 객체의 summary 딕셔너리에는 서버가 보고한 값이 포함됩니다. written_rows는 편의 속성이며, written_bytes()와 query_id()는 해당 값을 반환합니다. 삽입이 실패하면 예외가 발생합니다.
Pandas DataFrame, PyArrow 테이블, Arrow 기반 DataFrame에서 작동하는 특수 삽입 메서드는 고급 삽입(특수 삽입 메서드)를 참조하십시오.
NumPy 배열은 유효한 Sequence of Sequences이므로 기본
insert 메서드의 data 인수로 사용할 수 있으며, 별도의 특수 메서드는 필요하지 않습니다.예시
(id UInt32, name String, age UInt8)인 기존 users 테이블(table)이 이미 있다고 가정합니다.
기본적인 행 지향 삽입
컬럼 지향 방식 삽입
명시적으로 컬럼 타입을 지정해 삽입
특정 데이터베이스에 삽입하기
파일 삽입
Raw API
Python DB-API 2.0
clickhouse_connect.dbapi 모듈은 PEP 249의 연결 및 cursor 인터페이스를 구현합니다. 이 모듈은 API 수준 2.0, threadsafety=2, paramstyle="pyformat"를 선언합니다. 또한 PEP 249 유형 생성자인 Date, Time, Timestamp, Binary와 DateFromTicks, TimeFromTicks, TimestampFromTicks 함수를 제공합니다.
Cursor.execute 및 Cursor.executemany는 추가 settings 및 query_formats 키워드 인수를 받습니다. settings는 ClickHouse 설정을 전달합니다. query_formats는 SQL 문이 행을 반환할 때 Client.query와 동일한 매핑을 사용하여 ClickHouse 타입별 읽기 포맷을 적용합니다. executemany는 행 시퀀스가 구체화된 호환 가능한 INSERT ... VALUES SQL 문에 대해 드라이버의 네이티브 대량 삽입 경로를 사용합니다. fetchone, fetchmany, fetchall은 현재 구체화된 결과에서 데이터를 가져옵니다.
Cursor.description은 각 결과 컬럼 타입을 바탕으로 null_ok를 결정합니다. 널을 허용하지 않는 타입은 False를 보고하고, Nullable 래퍼, Variant, Dynamic을 포함한 널 허용 타입은 True를 보고합니다. None은 널 허용 여부를 알 수 없음을 의미합니다. 선행 주석을 무시하고 SELECT 또는 WITH로 시작하는 쿼리가 행이나 컬럼 메타데이터를 반환하지 않으면, cursor는 description을 채우기 위해 LIMIT 0 메타데이터 쿼리를 실행합니다. 해당 메타데이터 쿼리가 실패하면 description은 비어 있는 상태로 유지됩니다.
ClickHouse는 이 HTTP 인터페이스를 통해 전통적인 트랜잭션을 제공하지 않습니다. Connection.commit() 및 Connection.rollback()은 아무 작업도 수행하지 않습니다. 연결을 공유하는 경우에도 session ID 동시성 규칙이 계속 적용됩니다.
유틸리티 클래스와 함수
clickhouse_connect.__version__으로 노출됩니다.
예외
clickhouse_connect.driver.exceptions에 정의되어 있습니다. DatabaseError와 OperationalError는 ClickHouse 오류 코드가 담긴 숫자 code 속성과 UNKNOWN_TABLE 같은 기호 이름이 담긴 name 속성을 제공하므로, 애플리케이션은 메시지를 파싱하지 않고 exc.code를 기준으로 분기할 수 있습니다. show_clickhouse_errors가 비활성화되어 있어도 code는 설정되지만, name을 사용하려면 오류 세부 정보(True 또는 "scrub")가 필요합니다. 전송 오류처럼 사용할 수 없는 경우에는 둘 다 None입니다. 최종 사용자에게 호스트 또는 서버 버전 정보 없이 SQL 오류를 표시해야 하는 경우 show_clickhouse_errors="scrub"를 사용하십시오. 이 설정은 스트림 도중 발생하는 StreamFailureError 메시지와 일반 전송 메시지도 제어합니다. 이 설정은 str(exc)에만 적용됩니다. 전송 오류는 여전히 __cause__로 연결되며, 트레이스백에는 원래 호스트, URL 또는 라이브러리 오류 텍스트가 포함될 수 있습니다.
ClickHouse SQL 유틸리티
clickhouse_connect.driver.binding 모듈의 함수와 DT64Param 클래스는 ClickHouse SQL 쿼리를 올바르게 구성하고 이스케이프 처리하는 데 사용할 수 있습니다. 마찬가지로 clickhouse_connect.driver.parser 모듈의 함수는 ClickHouse 데이터 타입 이름을 파싱하는 데 사용할 수 있습니다.