Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ClickHouse Connect 드라이버 API

클라이언트 초기화

동기 Client를 생성하려면 clickhouse_connect.get_client를 사용하십시오. 네이티브 AsyncClient를 생성하려면 async extra를 설치한 후 clickhouse_connect.get_async_client를 await하십시오.

연결 인수

매개변수 유형 기본값 설명
interface str "http" "http" 또는 "https"입니다. 동기 팩터리에서는 실험적 "chdb" backend도 사용할 수 있습니다.
host str "localhost" ClickHouse 서버의 호스트명 또는 IP 주소입니다.
port int 또는 None 8123 or 8443 HTTP는 기본적으로 8123, HTTPS는 8443을 사용합니다. None을 전달하면 기본 포트를 사용하도록 요청합니다.
username str 또는 None "default" ClickHouse 사용자 이름입니다. useruser_name 별칭도 사용할 수 있습니다.
password str "" username의 비밀번호입니다. 사용자 이름/비밀번호 인증과 토큰 인증은 함께 사용하지 마십시오.
access_token str 또는 None None ClickHouse Cloud JWT 액세스 토큰입니다. token_provider 및 사용자 이름/비밀번호 인증과는 상호 배타적입니다.
token_provider callable 또는 None None JWT를 처음과 인증이 거부된 후에 제공하는 호출 가능 객체입니다. 비동기 provider는 get_async_client와 함께 사용할 수 있습니다.
database str 또는 None 사용자 기본값 기본 데이터베이스입니다. None을 전달하면 사용자의 서버 기본값을 요청합니다.
secure bool 또는 str False HTTPS/TLS를 활성화합니다. interface="https"를 지정해도 HTTPS가 선택되며, interface를 설정하지 않은 경우에는 포트 443 또는 8443을 사용해도 마찬가지입니다.
dsn str 또는 None None 연결 URL입니다. 명시적으로 지정한 키워드 인수는 DSN에서 파싱된 값보다 우선합니다. 자격 증명과 데이터베이스 이름에 포함된 예약 문자는 퍼센트 인코딩해야 합니다.
settings dict 또는 None None 클라이언트가 보내는 모든 요청에 적용되는 ClickHouse 설정입니다.
headers dict 또는 None None 클라이언트 초기화를 포함한 모든 요청에 적용되는 HTTP headers입니다. 사용자 headers는 driver 기본값 다음에 적용되며, 이를 재정의할 수 있습니다.
compress bool 또는 str True 압축을 활성화하거나 "lz4", "zstd", "br", "gzip" 중 하나를 선택합니다. Compression을 참조하세요.
query_limit int 0 적용 가능한 쿼리에 기본 행 수 제한이 추가됩니다. 0은 무제한을 의미합니다. 큰 결과는 모두 메모리에 구체화하지 말고 스트리밍하십시오.
query_retries int 2 재시도 가능한 읽기 실패에 허용되는 재시도 한도입니다. 명령과 삽입 작업은 다시 실행할 경우 부수 효과가 중복될 수 있으므로 일반적으로 재시도하지 않습니다.
connect_timeout int 10 초 단위의 연결 타임아웃입니다.
send_receive_timeout int 300 초 단위의 소켓 읽기 타임아웃입니다.
client_name str or None None system.query_log에서 식별할 수 있도록 HTTP User-Agent 앞에 추가되는 접두사입니다.
session_id str 또는 None 동기용으로 생성 명시적으로 지정하는 ClickHouse session ID입니다. 동기 클라이언트는 기본적으로 이를 생성하지만, async 클라이언트는 생성하지 않습니다.
autogenerate_session_id bool 또는 None 동기에서는 전역 설정, 비동기에서는 False 자동 session ID 생성을 재정의합니다. session 상태가 필요하지 않다면 동시 작업에서 공유되는 클라이언트에서는 이 기능을 비활성화하십시오.
autogenerate_query_id bool 또는 None 전역 설정, True 자동 UUID 쿼리 ID 생성 동작을 재정의합니다.
http_proxy str 또는 None 환경/기본값 클라이언트별 HTTP 프록시 주소.
https_proxy str 또는 None 환경/기본값 클라이언트별 HTTPS 프록시 주소.
pool_mgr urllib3.PoolManager 또는 None 공유 기본값 동기식 클라이언트에만 사용하는 사용자 지정 풀 관리자.
tz_source str or None "auto" 시간대 메타데이터가 없는 컬럼에 사용할 폴백 시간대 소스: "auto", "server", 또는 "local".
tz_mode str or None "naive_utc" UTC 결과 처리 정책: "naive_utc", "aware", 또는 "schema"입니다. 시간대를 참조하십시오.
show_clickhouse_errors bool, Boolean 문자열, "scrub", 또는 None True 서버 오류, 전송 오류 및 스트림 도중 발생하는 StreamFailureErrorstr(exc)를 제어합니다. True이면 요청 URL과 서버 버전 정보가 포함됩니다. "scrub"은 SQL 오류 텍스트와 심볼릭 이름은 유지하지만 호스트/URL 및 (version ...) 정보는 제거합니다. False는 일반 메시지를 반환합니다(서버 오류에서도 code는 설정됨). Boolean 문자열도 사용할 수 있습니다. 그 밖의 문자열은 ProgrammingError를 발생시킵니다. 전송 오류의 경우 __cause__와 트레이스백에는 원래 전송 예외가 계속 포함됩니다.
proxy_path str "" 프록시를 통해 라우팅할 때 서버 URL에 추가되는 경로 접두사입니다.
form_encode_query_params bool False 쿼리 매개변수를 항상 form-encoded 요청 본문에 넣습니다. 이 값이 false여도 큰 비바이너리 매개변수 페이로드는 자동으로 이동됩니다.
rename_response_column str 또는 None None 컬럼 이름 변경 방식: "remove_prefix", "to_camelcase", "to_camelcase_without_prefix", "to_underscore", 또는 "to_underscore_without_prefix".

비동기 팩토리에서는 aiohttp 연결 풀을 구성하기 위해 connector_limit=100, connector_limit_per_host=20, keepalive_timeout=30.0도 사용할 수 있습니다. pool_mgr는 사용할 수 없습니다. 동기식 chDB 백엔드에서는 pathchdb_options를 사용할 수 있습니다. 자세한 내용은 내장 chDB 백엔드를 참조하십시오.

HTTPS/TLS 인수

매개변수 유형 기본값 설명
verify bool or str True 서버 인증서와 호스트명을 검증합니다. verify="proxy"는 프록시 TLS 모드를 활성화합니다.
ca_cert str or None None CA 번들 경로입니다. certifi package와 함께 제공되는 번들을 선택하려면 "certifi"를 사용하십시오.
client_cert str or None None PEM 클라이언트 인증서입니다. 필요한 경우 중간 인증서도 포함합니다.
client_cert_key str or None None 키가 client_cert에 포함되지 않은 경우 사용할 private key 경로입니다.
server_host_name str or None None 터널 또는 Private Endpoint를 사용하는 경우처럼 host와 다를 때 사용할 TLS 인증서/SNI 호스트명입니다.
tls_mode str or None None "mutual"은 ClickHouse 상호 TLS 인증을 사용합니다. "proxy""strict"는 ClickHouse 인증서 인증 헤더를 활성화하지 않고 TLS 계층에서 인증서를 전송합니다. 기본값 None은 클라이언트 인증서가 제공되면 "mutual"처럼 동작합니다.

설정 인수

마지막으로, get_clientsettings 인수는 각 클라이언트 요청마다 추가 ClickHouse 설정을 서버에 전달하는 데 사용됩니다. 대부분의 경우 readonly=1 권한을 가진 사용자는 쿼리와 함께 전송된 설정을 변경할 수 없으므로, ClickHouse Connect는 최종 요청에서 이러한 설정을 제외하고 경고를 기록합니다. 다음 설정은 ClickHouse Connect에서 사용하는 HTTP 쿼리/세션에만 적용되며, 일반적인 ClickHouse 설정으로 문서화되어 있지 않습니다.

설정 설명
buffer_size 서버 측 HTTP 응답 버퍼 크기(바이트 단위)입니다.
session_id 관련 요청을 연결하는 데 사용하는 세션 ID입니다. 임시 테이블 및 세션 상태에 필요합니다.
compress 서버에 HTTP 응답을 압축하도록 요청합니다. 일반적으로 클라이언트 압축 옵션으로 관리됩니다.
decompress 서버에 요청 본문을 압축 해제하도록 지시합니다. 사전 압축된 raw 삽입에 사용됩니다.
quota_key 요청에 연결된 쿼터 키입니다.
session_check 세션이 존재하는지 확인하도록 서버에 요청합니다.
session_timeout 세션 비활성 timeout 시간(초)입니다.
wait_end_of_query 서버에서 전체 응답을 버퍼링합니다. 클라이언트는 비스트리밍 요약 정보가 필요할 때 이 값을 설정합니다.
query_id 요청에 대한 명시적 쿼리 ID입니다.
client_protocol_version 네이티브 포맷 클라이언트 프로토콜 capability 수준입니다. 일반적으로 자동으로 협상됩니다.
role 요청/세션에 사용할 ClickHouse 역할(Role)입니다.

각 쿼리와 함께 전송할 수 있는 다른 ClickHouse 설정은 ClickHouse 문서를 참조하십시오.

클라이언트 생성 예시

  • 매개변수를 지정하지 않으면 ClickHouse Connect 클라이언트는 localhost의 기본 HTTP 포트에 default 사용자로 비밀번호 없이 연결됩니다:
import clickhouse_connect

client = clickhouse_connect.get_client()
print(client.server_version)
  • 보안(HTTPS)을 사용하는 외부 ClickHouse 서버에 연결
import clickhouse_connect

client = clickhouse_connect.get_client(
    host="play.clickhouse.com",
    secure=True,
    port=443,
    username="play",
    password="clickhouse",
)
print(client.command("SELECT timezone()"))
  • 세션 ID와 기타 사용자 지정 연결 매개변수, ClickHouse 설정을 사용해 연결합니다.
import clickhouse_connect

client = clickhouse_connect.get_client(
    host="play.clickhouse.com",
    username="play",
    password="clickhouse",
    port=443,
    secure=True,
    session_id="example_session_1",
    connect_timeout=15,
    database="github",
    settings={"distributed_ddl_task_timeout": 300},
)
print(client.database)
# Output: github

내장 chDB 백엔드

실험적인 인프로세스 chDB 백엔드를 사용하려면 clickhouse-connect[chdb]를 설치하십시오. 이 백엔드는 동기식 클라이언트의 쿼리, 삽입, 스트리밍 및 Arrow 메서드를 제공합니다:

import clickhouse_connect

with clickhouse_connect.get_client(interface="chdb") as client:
    result = client.query("SELECT sum(number) FROM numbers(10)")
    print(result.first_row)
    # Output: (45,)

기본값은 인메모리 데이터베이스입니다. 영구 저장소를 사용하려면 path="/data/my_chdb"를 지정하거나 dsn="chdb:///data/my_chdb"를 사용하십시오. 백엔드는 프로세스당 하나의 엔진 경로만 허용하며 get_async_client 또는 외부 데이터를 지원하지 않습니다.

클라이언트 수명 주기와 모범 사례

ClickHouse Connect 클라이언트를 생성하는 작업은 연결을 설정하고, 서버 메타데이터를 가져오고, 설정을 초기화하는 과정이 포함되므로 비용이 많이 드는 작업입니다. 최적의 성능을 위해 다음 모범 사례를 따르십시오:

핵심 원칙

  • 클라이언트 재사용: 애플리케이션 시작 시 클라이언트를 한 번만 생성하고, 애플리케이션이 실행되는 동안 계속 재사용합니다
  • 빈번한 생성 방지: 각 쿼리나 요청마다 새 클라이언트를 생성하지 마십시오
  • 적절한 정리: 종료할 때는 연결 풀 리소스를 해제할 수 있도록 항상 클라이언트를 닫으십시오
  • 가능하면 공유: 단일 클라이언트는 연결 풀을 통해 많은 동시 쿼리를 처리할 수 있습니다(아래의 스레딩 참고 사항 참조)

기본 패턴

단일 클라이언트를 재사용하세요:

import clickhouse_connect

# Create once at startup
client = clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
)

# Reuse for all queries
for i in range(1000):
    result = client.query("SELECT count() FROM users")

# Close on shutdown
client.close()

클라이언트를 반복해서 생성하지 마세요:

# BAD: Creates 1000 clients with expensive initialization overhead
for i in range(1000):
    client = clickhouse_connect.get_client(
        host="my-host",
        username="default",
        password="password",
    )
    result = client.query("SELECT count() FROM users")
    client.close()

멀티스레드 애플리케이션

스레드 간에 클라이언트를 안전하게 공유하려면:

import clickhouse_connect
import threading

# Option 1: Disable sessions (recommended for shared clients)
client = clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
    autogenerate_session_id=False,
)

def worker(thread_id):
    # All threads can now safely use the same client
    result = client.query(f"SELECT {thread_id}")
    print(f"Thread {thread_id}: {result.result_rows[0][0]}")

threads = [threading.Thread(target=worker, args=(i,)) for i in range(10)]
for t in threads:
    t.start()
for t in threads:
    t.join()

client.close()

세션 대신: 세션이 필요하다면(예: 임시 테이블 사용 시) 스레드마다 별도의 클라이언트를 생성하십시오:

def worker(thread_id):
    # Each thread gets its own client with isolated session
    client = clickhouse_connect.get_client(
        host="my-host",
        username="default",
        password="password",
    )
    client.command("CREATE TEMPORARY TABLE temp (id UInt32) ENGINE = Memory")
    # ... use temp table ...
    client.close()

올바른 정리

종료 시에는 항상 클라이언트를 닫으십시오. client.close()는 클라이언트가 자체 풀 관리자(pool manager)를 소유한 경우에만(예: 사용자 지정 TLS/프록시 옵션으로 생성된 경우) 클라이언트를 정리하고 풀링된 HTTP 연결을 닫습니다. 이 점에 유의하십시오. 기본 공유 풀에서는 client.close_connections()를 사용해 소켓을 미리 정리하십시오. 그렇지 않으면 연결은 idle 만료 시점이나 프로세스 종료 시 자동으로 회수됩니다.

client = clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
)
try:
    result = client.query("SELECT 1")
finally:
    client.close()

또는 컨텍스트 관리자를 사용하세요:

with clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
) as client:
    result = client.query("SELECT 1")

여러 클라이언트를 사용해야 하는 경우

여러 클라이언트는 다음과 같은 경우에 적합합니다.

  • 서로 다른 서버: ClickHouse 서버 또는 클러스터마다 클라이언트를 1개씩 사용
  • 서로 다른 자격 증명: 서로 다른 사용자 또는 접근 수준별로 별도의 클라이언트 사용
  • 서로 다른 데이터베이스: 여러 데이터베이스에서 작업해야 하는 경우
  • 격리된 세션: 임시 테이블 또는 세션별 설정을 위해 별도의 세션이 필요한 경우
  • 스레드별 격리: 스레드마다 독립적인 세션이 필요한 경우(위 예시 참조)

공통 메서드 인수

여러 클라이언트 메서드는 공통 parameterssettings 인수 중 하나 또는 둘 다를 사용합니다. 이러한 키워드 인수는 아래에서 설명합니다.

매개변수 인수

ClickHouse Connect Client의 query*command 메서드는 Python 표현식을 ClickHouse 값 표현식에 바인딩하는 데 사용하는 선택적 키워드 인수 parameters를 지원합니다. 바인딩은 두 가지 방식으로 사용할 수 있습니다.

서버 측 바인딩

ClickHouse는 쿼리 값에 대해 서버 측 바인딩을 지원합니다. 바인딩된 값은 쿼리와 별도로 HTTP 매개변수로 전송됩니다. ClickHouse Connect는 {<name>:<datatype>} 형식의 표현식이 감지되면 이 모드를 사용합니다. 값은 Python 딕셔너리로 전달하십시오.

매개변수 이름은 ClickHouse ASCII BareWord 이름이어야 합니다. 서버에서 허용하는 경우 드라이버는 {$tenant_id:String}처럼 이름의 시작, 내부 또는 끝에 있는 $를 허용합니다. bytes, bytearray 또는 memoryview와 같은 버퍼 값을 가지며 $로 시작하고 끝나는 딕셔너리 키는 ClickHouse Connect의 원시 바이너리 매개변수 규칙을 위해 예약됩니다. 이러한 키를 비바이너리 서버 측 매개변수에 사용하는 경우 단일 {name:Type} 플레이스홀더만 사용하십시오. 반복되는 $tag$ 이름은 ClickHouse에서 Heredoc 마커로 파싱될 수 있습니다.

널 허용 값에는 Python None을 사용하십시오. 중첩된 None 값은 ArrayTuple 매개변수 내부와 dict_parameter_format"map"으로 설정된 경우 Map 리터럴 내부에서 지원됩니다.

  • Python 딕셔너리, DateTime 값, 문자열 값을 사용하는 서버 측 바인딩
import datetime

my_date = datetime.datetime(2022, 10, 1, 15, 20, 5)

parameters = {
    "table": "my_table",
    "v1": my_date,
    "v2": "a string with a single quote'",
}
client.query(
    "SELECT * FROM {table:Identifier} "
    "WHERE date >= {v1:DateTime} AND string ILIKE {v2:String}",
    parameters=parameters,
)

이는 다음과 같습니다:

SELECT *
FROM my_table
WHERE date >= '2022-10-01 15:20:05'
  AND string ILIKE 'a string with a single quote\''

클라이언트 측 바인딩

ClickHouse Connect는 클라이언트 측 매개변수 바인딩도 지원하며, 이를 통해 템플릿 기반 SQL 쿼리를 더 유연하게 생성할 수 있습니다. 클라이언트 측 바인딩에서는 parameters 인수가 딕셔너리 또는 시퀀스여야 합니다. 클라이언트 측 바인딩은 매개변수 치환을 위해 Python의 "printf" 스타일 문자열 포맷팅을 사용합니다.

서버 측 바인딩과 달리 클라이언트 측 바인딩은 데이터베이스, 테이블, 컬럼 이름과 같은 데이터베이스 식별자에는 사용할 수 없습니다. Python 스타일 포맷팅은 서로 다른 문자열 타입을 구분하지 못하며, 이러한 값은 서로 다른 방식으로 포맷팅해야 하기 때문입니다(데이터베이스 식별자에는 backticks 또는 큰따옴표를 사용하고, 데이터 값에는 작은따옴표를 사용).

  • Python 딕셔너리, DateTime 값, 문자열 이스케이프를 사용하는 예시
import datetime

my_date = datetime.datetime(2022, 10, 1, 15, 20, 5)

parameters = {"v1": my_date, "v2": "a string with a single quote'"}
client.query(
    "SELECT * FROM my_table "
    "WHERE date >= %(v1)s AND string ILIKE %(v2)s",
    parameters=parameters,
)

그러면 서버에서 다음 쿼리가 생성됩니다:

SELECT *
FROM my_table
WHERE date >= '2022-10-01 15:20:05'
  AND string ILIKE 'a string with a single quote\''
  • Python 시퀀스(Tuple), Float64, IPv4Address 사용 예시
import ipaddress

parameters = (35200.44, ipaddress.IPv4Address(0x443d04fe))
client.query(
    "SELECT * FROM some_table WHERE metric >= %s AND ip_address = %s",
    parameters=parameters,
)

그러면 서버에서 다음 쿼리가 생성됩니다:

SELECT *
FROM some_table
WHERE metric >= 35200.44
  AND ip_address = '68.61.4.254'

설정 인수

주요 ClickHouse Connect Client의 "insert" 및 "select" 메서드는 모두 포함된 SQL 문에 대해 ClickHouse 서버 사용자 설정을 전달할 수 있도록 선택적 settings 키워드 인수를 지원합니다. settings 인수는 딕셔너리여야 합니다. 각 항목은 ClickHouse 설정 이름과 해당 값으로 이루어져야 합니다. 값은 서버로 쿼리 매개변수로 전송될 때 문자열로 변환된다는 점에 유의하십시오.

클라이언트 수준 설정과 마찬가지로, ClickHouse Connect는 서버가 readonly=1로 표시한 설정을 관련 로그 메시지와 함께 모두 제외합니다. ClickHouse HTTP 인터페이스를 통한 쿼리에만 적용되는 설정은 항상 유효합니다. 이러한 설정은 get_client API에서 설명합니다.

ClickHouse 설정 사용 예시:

settings = {
    "merge_tree_min_rows_for_concurrent_read": 65535,
    "session_id": "session_1234",
    "use_skip_indexes": False,
}
client.query(
    "SELECT event_type, sum(timeout) "
    "FROM event_errors WHERE event_time > '2022-08-01'",
    settings=settings,
)

Client command 메서드

표 형식의 데이터셋을 반환하지 않는 SQL 문이나, 단일 원시 값 또는 단일 행을 반환하는 쿼리에는 Client.command를 사용합니다. 응답에 따라 문자열, 정수, 문자열 시퀀스 또는 QuerySummary를 반환합니다. 빈 결과 집합을 생성하는 읽기 작업은 빈 문자열을 반환합니다.

매개변수 Type Default Description
cmd str Required 단일 값 또는 값으로 이루어진 단일 행을 반환하는 ClickHouse SQL 문입니다.
parameters dict or sequence None 매개변수 설명을 참조하십시오.
data str or bytes None 명령과 함께 POST 본문으로 포함할 수 있는 선택적 데이터입니다.
settings dict None 설정 설명을 참조하십시오.
use_database bool True 클라이언트 데이터베이스(클라이언트 생성 시 지정됨)를 사용합니다. False이면 명령은 연결된 사용자의 기본 ClickHouse 서버 데이터베이스를 사용합니다.
external_data ExternalData None 쿼리와 함께 사용할 파일 또는 바이너리 데이터가 포함된 ExternalData 객체입니다. 고급 쿼리(외부 데이터)를 참조하십시오.
transport_settings dict None 이 요청에 포함할 HTTP 헤더의 선택적 딕셔너리입니다. 각 키-값 쌍은 HTTP 헤더로 추가됩니다(예: {'X-Custom-Header': 'value'}). 프록시 인증, 요청 추적 또는 중간 인프라에 필요한 헤더를 전달할 때 유용합니다.

명령 예시

DDL 문

import clickhouse_connect

client = clickhouse_connect.get_client()

# Create a table. A successful DDL returns QuerySummary.
summary = client.command(
    "CREATE TABLE test_command "
    "(col_1 String, col_2 DateTime) "
    "ENGINE MergeTree ORDER BY tuple()"
)
print(summary.query_id())

# Show table definition
result = client.command("SHOW CREATE TABLE test_command")
print(result)
# Output:
# CREATE TABLE default.test_command
# (
#     `col_1` String,
#     `col_2` DateTime
# )
# ENGINE = MergeTree
# ORDER BY tuple()

# Drop table
client.command("DROP TABLE test_command")

단일 값을 반환하는 간단한 쿼리

import clickhouse_connect

client = clickhouse_connect.get_client()

# Single value result
count = client.command("SELECT count() FROM system.tables")
print(count)

# Server version
version = client.command("SELECT version()")
print(version)

매개변수를 사용하는 명령

import clickhouse_connect

client = clickhouse_connect.get_client()

# 클라이언트 측 매개변수 사용
table_name = "system"
result = client.command(
    "SELECT count() FROM system.tables WHERE database = %(db)s",
    parameters={"db": table_name}
)

# 서버 측 매개변수 사용
result = client.command(
    "SELECT count() FROM system.tables WHERE database = {db:String}",
    parameters={"db": "system"}
)

설정이 포함된 명령

import clickhouse_connect

client = clickhouse_connect.get_client()

# 특정 설정을 사용해 명령 실행
result = client.command(
    "OPTIMIZE TABLE large_table FINAL",
    settings={"optimize_throw_if_noop": 1}
)

Client query 메서드

Client.query는 ClickHouse Native 형식의 테이블형 데이터셋을 가져와 QueryResult를 반환합니다. 결과 속성에 접근하는 시점에 전체 결과가 구체화됩니다. 메모리에 보관하지 않아야 하는 결과에는 스트리밍 메서드를 사용하세요.

매개변수 유형 기본값 설명
query str 필수 테이블형 결과를 반환하는 ClickHouse 쿼리이며, 대부분 SELECT 또는 DESCRIBE입니다. context에서 제공되는 경우 생략할 수 있습니다.
parameters dict or sequence None 매개변수 인수를 참조하세요.
settings dict None 설정 인수를 참조하세요.
query_formats dict None ClickHouse 유형별 읽기 포맷입니다. Read formats을 참조하세요.
column_formats dict None Nested type 포맷 매핑을 포함한 결과 컬럼별 읽기 포맷입니다.
encoding str None String 컬럼 인코딩입니다. 기본값은 UTF-8입니다.
use_none bool True SQL NULL에 대해 None을 반환합니다. false이면 해당 유형의 기본 NULL 값을 반환합니다. NumPy/Pandas 메서드는 성능 중심의 기본값을 선택합니다.
column_oriented bool False 결과를 행이 아닌 컬럼 기준으로 반환합니다.
use_numpy bool False 호환되는 결과 컬럼을 QueryResult 내부의 NumPy 배열로 읽어옵니다. 원하는 결과가 하나의 NumPy 매트릭스라면 query_np를 사용하는 것이 좋습니다.
max_str_len int 0 use_numpy를 사용할 때 이 길이까지의 String 컬럼에 고정 폭 유니코드 dtype을 사용합니다. 0이면 object 배열을 사용합니다.
context QueryContext None 재사용 가능한 쿼리 Context입니다. 메서드에 명시적으로 전달한 인수는 context 값을 재정의합니다.
query_tz str or tzinfo None 모든 DateTimeDateTime64 결과 컬럼에 적용되는 시간대입니다.
column_tzs dict None 컬럼별 시간대 매핑입니다.
external_data ExternalData None 외부 파일 또는 바이너리 데이터입니다. External data를 참조하세요.
transport_settings dict None 이 요청에 추가되는 HTTP 헤더입니다.
tz_mode str 클라이언트 기본값 "naive_utc", "aware", 또는 "schema" 시간대 처리에 대한 쿼리별 재정의입니다.

쿼리 예시

기본 쿼리

import clickhouse_connect

client = clickhouse_connect.get_client()

# Simple SELECT query
result = client.query(
    "SELECT number, toString(number) AS label FROM numbers(3)"
)

# Access results as rows
for row in result.result_rows:
    print(row)
# Output:
# (0, '0')
# (1, '1')
# (2, '2')

# Access column names and types
print(result.column_names)
# Output: ('number', 'label')
print([col_type.name for col_type in result.column_types])
# Output: ['UInt64', 'String']

쿼리 결과 조회하기

import clickhouse_connect

client = clickhouse_connect.get_client()

result = client.query("SELECT number, toString(number) AS str FROM system.numbers LIMIT 3")

# Row-oriented access (default)
print(result.result_rows)
# Output: [(0, '0'), (1, '1'), (2, '2')]

# Column-oriented access
print(result.result_columns)
# Output: [[0, 1, 2], ['0', '1', '2']]

# Named results (list of dictionaries)
for row_dict in result.named_results():
    print(row_dict)
# Output:
# {'number': 0, 'str': '0'}
# {'number': 1, 'str': '1'}
# {'number': 2, 'str': '2'}

# First row as dictionary
print(result.first_item)
# Output: {'number': 0, 'str': '0'}

# First row as tuple
print(result.first_row)
# Output: (0, '0')

클라이언트 측 매개변수를 사용한 쿼리

import clickhouse_connect

client = clickhouse_connect.get_client()

# 딕셔너리 매개변수 사용 (printf 스타일)
query = "SELECT * FROM system.tables WHERE database = %(db)s AND name LIKE %(pattern)s"
parameters = {"db": "system", "pattern": "%query%"}
result = client.query(query, parameters=parameters)

# 튜플 매개변수 사용
query = "SELECT * FROM system.tables WHERE database = %s LIMIT %s"
parameters = ("system", 5)
result = client.query(query, parameters=parameters)

서버 측 매개변수를 사용하는 쿼리

import clickhouse_connect

client = clickhouse_connect.get_client()

# 서버 측 바인딩 (보안이 강화되고 SELECT 쿼리 성능이 향상됨)
query = "SELECT * FROM system.tables WHERE database = {db:String} AND name = {tbl:String}"
parameters = {"db": "system", "tbl": "query_log"}

result = client.query(query, parameters=parameters)

설정을 지정한 쿼리

import clickhouse_connect

client = clickhouse_connect.get_client()

# 쿼리와 함께 ClickHouse 설정을 지정합니다
result = client.query(
    "SELECT sum(number) FROM numbers(1000000)",
    settings={
        "max_block_size": 100000,
        "max_execution_time": 30
    }
)

QueryResult 객체

기본 query 메서드는 다음 공개 속성을 포함하는 QueryResult 객체를 반환합니다.

  • result_rows – 행 기준으로 구성된 결과 매트릭스입니다.
  • result_columns – 컬럼 기준으로 구성된 결과 매트릭스입니다.
  • result_set – 쿼리 방향에 따라 result_rows 또는 result_columns입니다.
  • column_names – 결과 컬럼명의 Tuple입니다.
  • column_typesClickHouseType 객체의 Tuple입니다.
  • row_count – 구체화된 결과 행 수입니다.
  • query_id – 요청에 대해 보고되었거나 생성된 쿼리 ID입니다. 빈 문자열은 사용 가능한 값이 없었음을 의미합니다.
  • summaryX-ClickHouse-Summary 응답 헤더에서 디코딩된 딕셔너리입니다.
  • first_item – 딕셔너리 형식의 첫 번째 행이며, 결과가 비어 있으면 None입니다.
  • first_row – 시퀀스 형식의 첫 번째 행이며, 결과가 비어 있으면 None입니다.
  • column_block_stream, row_block_stream, rows_stream – 내부 스트림 컨텍스트입니다. 대신 해당 클라이언트의 스트리밍 메서드를 사용하십시오.

지원되는 StreamContext API는 스트리밍 쿼리에서 확인하십시오.

NumPy, Pandas 또는 Arrow로 쿼리 결과 처리하기

ClickHouse Connect는 NumPy, Pandas, Arrow 데이터 포맷용 전용 쿼리 메서드를 제공합니다. 예시, 스트리밍 지원, 고급 타입 처리 등 이러한 메서드의 사용법에 관한 자세한 내용은 고급 쿼리(NumPy, Pandas 및 Arrow 쿼리)를 참조하십시오.

클라이언트 스트리밍 쿼리 메서드

대규모 결과 집합(result set)을 스트리밍하려면 ClickHouse Connect에서 여러 스트리밍 메서드를 제공합니다. 자세한 내용과 예시는 고급 쿼리(Streaming Queries)를 참조하십시오.

클라이언트 insert 메서드

여러 레코드를 ClickHouse에 삽입하는 일반적인 경우에는 Client.insert 메서드를 사용합니다. 이 메서드는 다음 매개변수를 받습니다.

Parameter Type Default Description
table str Required 대상 테이블입니다. 데이터베이스를 포함한 이름도 사용할 수 있습니다. context에서 제공하는 경우 생략할 수 있습니다.
data Sequence of Sequences Required 행 지향 또는 컬럼 지향 데이터 매트릭스입니다. 나중에 InsertContext를 통해 제공할 수도 있습니다.
column_names str or Sequence[str] "*" 순서가 지정된 컬럼입니다. "*"를 사용하면 삽입 가능한 모든 컬럼을 찾기 위해 메타데이터 쿼리를 실행합니다.
database str or None Client database table에 데이터베이스가 지정되지 않은 경우의 대상 데이터베이스입니다.
column_types Sequence[ClickHouseType] None 명시적인 컬럼 타입입니다. 제공하면 메타데이터 쿼리를 실행하지 않아도 됩니다.
column_type_names Sequence[str] None 명시적인 ClickHouse 타입 이름입니다. column_types 대신 사용할 수 있습니다.
column_oriented bool False data를 행이 아닌 컬럼으로 해석합니다.
settings dict None 설정 인수를 참조하십시오.
context InsertContext None 재사용 가능한 삽입 컨텍스트입니다. InsertContexts를 참조하십시오.
transport_settings dict None 이 요청에 추가되는 HTTP 헤더입니다.

이 메서드는 QuerySummary를 반환합니다. 이 객체의 summary 딕셔너리에는 서버가 보고한 값이 포함됩니다. written_rows는 편의 속성이며, written_bytes()query_id()는 해당 값을 반환합니다. 삽입이 실패하면 예외가 발생합니다.

Pandas DataFrame, PyArrow 테이블, Arrow 기반 DataFrame에서 작동하는 특수 삽입 메서드는 고급 삽입(특수 삽입 메서드)를 참조하십시오.

예시

아래 예시에서는 스키마(schema)가 (id UInt32, name String, age UInt8)인 기존 users 테이블(table)이 이미 있다고 가정합니다.

기본적인 행 지향 삽입

import clickhouse_connect

client = clickhouse_connect.get_client()

# Row-oriented data: each inner list is a row
data = [
    [13, "user_1", 25],
    [79, "user_2", 30],
]

client.insert("users", data, column_names=["id", "name", "age"])

컬럼 지향 방식 삽입

import clickhouse_connect

client = clickhouse_connect.get_client()

# Column-oriented data: each inner list is a column
data = [
    [13, 79],  # id column
    ["user_1", "user_2"],  # name column
    [25, 30],  # age column
]

client.insert("users", data, column_names=["id", "name", "age"], column_oriented=True)

명시적으로 컬럼 타입을 지정해 삽입

import clickhouse_connect

client = clickhouse_connect.get_client()

# Useful when you want to avoid a DESCRIBE query to the server
data = [
    [13, "user_1", 25],
    [79, "user_2", 30],
]

client.insert(
    "users",
    data,
    column_names=["id", "name", "age"],
    column_type_names=["UInt32", "String", "UInt8"],
)

특정 데이터베이스에 삽입하기

import clickhouse_connect

client = clickhouse_connect.get_client()

data = [
    [13, "user_1", 25],
    [79, "user_2", 30],
]

# Insert into a table in a specific database
client.insert(
    "users",
    data,
    column_names=["id", "name", "age"],
    database="production",
)

파일 삽입

파일의 데이터를 ClickHouse 테이블에 직접 삽입하는 방법은 고급 삽입(파일 삽입)을 참조하십시오.

Raw API

유형 변환 없이 ClickHouse HTTP 인터페이스에 직접 액세스해야 하는 고급 사용 사례는 고급 사용법(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, BinaryDateFromTicks, TimeFromTicks, TimestampFromTicks 함수를 제공합니다.

from clickhouse_connect import dbapi

connection = dbapi.connect(
    host="localhost",
    username="default",
    password="password",
    database="default",
)
cursor = connection.cursor()

try:
    cursor.execute(
        "SELECT name FROM system.tables "
        "WHERE database = %(database)s ORDER BY name LIMIT 5",
        {"database": "system"},
    )
    print(cursor.description)
    print(cursor.fetchall())
finally:
    cursor.close()
    connection.close()

Cursor.executeCursor.executemany는 추가 settingsquery_formats 키워드 인수를 받습니다. settings는 ClickHouse 설정을 전달합니다. query_formats는 SQL 문이 행을 반환할 때 Client.query와 동일한 매핑을 사용하여 ClickHouse 타입별 읽기 포맷을 적용합니다. Cursor.execute는 키워드 전용 pyformat_encoded 인수도 받습니다. 기본값 True는 DB-API pyformat 규약을 따릅니다. SQLAlchemy 방언은 SQL 문 컴파일러가 원시 백분율 기호를 생성한 경우 이를 False로 설정하므로, 일반적으로 애플리케이션에서 설정할 필요가 없습니다. 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__으로 노출됩니다.

예외

DB-API 2.0 예외 계층을 포함한 사용자 정의 예외는 clickhouse_connect.driver.exceptions에 정의되어 있습니다. DatabaseErrorOperationalError는 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 데이터 타입 이름을 파싱하는 데 사용할 수 있습니다.

멀티스레드, 멀티프로세스 및 비동기/이벤트 기반 사용 사례

멀티스레드, 멀티프로세스 및 비동기/이벤트 기반 애플리케이션에서 ClickHouse Connect를 사용하는 방법에 대한 자세한 내용은 고급 사용법(멀티스레드, 멀티프로세스 및 비동기/이벤트 기반 사용 사례)를 참조하십시오.

AsyncClient

asyncio 환경에서 네이티브로 사용하는 방법은 고급 사용법(AsyncClient)를 참조하십시오.

ClickHouse 세션 ID 관리

멀티스레드 또는 동시 처리 애플리케이션에서 ClickHouse 세션 ID를 관리하는 방법에 대한 자세한 내용은 고급 사용법(ClickHouse 세션 ID 관리)을 참조하십시오.

HTTP 연결 풀 사용자 지정

대규모 멀티스레드 애플리케이션에서 HTTP 연결 풀을 사용자 지정하는 방법에 대한 자세한 내용은 고급 사용법(HTTP 연결 풀 사용자 지정)을 참조하십시오.

Navigation