TopGit
Đánh giá repo GitHub

ClickHouse Go Driver: Client Go Hiệu Suất Cao

ClickHouse/clickhouse-go
CTopGit review image for ClickHouse/clickhouse-go
Review by Topgit.dev for ClickHouse/clickhouse-go, with GitHub repository stats and README context.
Nhận định nhanh

ClickHouse Go Driver là client Go chính thức cho ClickHouse, cung cấp cả interface giao thức native (clickhouse.Open) lẫn interface database/sql chuẩn (clickhouse.OpenDB) trong cùng một package. Hãy dùng interface native cho code mới, nhạy cảm về hiệu năng — nó encode column trực tiếp. Hãy dùng OpenDB khi bạn đã chuẩn hoá theo công cụ database/sql hoặc một ORM và không muốn thêm một API driver thứ hai vào codebase.

Sao
★ 3.4k
Fork
⑂ 694
Ngôn ngữ
Go
Giấy phép
Apache-2.0
Chủ đề
Data
Cập nhật
Oct 2026
Trang chủ
—
GitHub

Kết Nối Ứng Dụng Go Với ClickHouse

ClickHouse Go Driver là một client database SQL viết bằng Golang cho ClickHouse, được publish dưới tên github.com/ClickHouse/clickhouse-go/v2. Nó cung cấp hai cách kết nối: một driver.Conn dành riêng cho ClickHouse, mở bằng clickhouse.Open, và một interface tương thích database/sql, mở bằng clickhouse.OpenDB. Cả hai hoạt động qua transport TCP native hoặc HTTP, và từ bản 2.3.0 trở lên client dùng thư viện ch-go ở tầng thấp hơn để encode và nén.

Năng Lực Cốt Lõi Và Tính Năng Nâng Cao

  • ✓Hai interface kết nối trong cùng một package: clickhouse.Open trả về một driver.Conn dành riêng cho ClickHouse để encode column trực tiếp, còn clickhouse.OpenDB trả về một database/sql.DB chuẩn cho công cụ và ORM hiện có.
  • ✓Cả hai interface đều hỗ trợ transport TCP native lẫn HTTP, nên cùng một client có thể chạy qua proxy như ChProxy hoặc load balancer HTTP mà không cần đổi API.
  • ✓Marshal struct theo cả hai chiều — ScanStruct/Select map kết quả query vào struct, còn AppendStruct ghi một struct ngược lại thành một row.
  • ✓Connection pool có thể cấu hình qua MaxOpenConns, MaxIdleConns, và ConnMaxLifetime, cùng với failover và load balancing trên danh sách host theo chiến lược in_order, round_robin, hoặc random.
  • ✓Nén hỗ trợ LZ4, ZSTD, LZ4HC, GZIP, Deflate, và Brotli, với nén block native và nén web HTTP được xử lý như hai lớp riêng biệt, cấu hình rõ ràng.
  • ✓Async insert qua helper WithAsync(), dùng được trên cả interface native lẫn database/sql, thay thế cho API AsyncInsert() đã deprecated.
  • ✓Structured logging qua package log/slog của Go, hỗ trợ JWT authentication, và truy cập các tính năng giao thức qua Context như query ID, quota key, OpenTelemetry, và các sự kiện tiến trình thực thi.
Số sao GitHub của repo này thay đổi thế nào theo thời gian. Nguồn: star-history.com.Xem lịch sử sao ↗

Bắt Đầu Với Driver

Cài đặt bằng `go get github.com/ClickHouse/clickhouse-go/v2` — đó là bước cài đặt duy nhất mà README ghi lại; không có CLI riêng hay file config nào cần thiết lập trước. Phiên bản Go được hỗ trợ đi theo phiên bản của chính client: 2.0-2.2 cần Go 1.17/1.18, 2.3+ cần 1.18.4+/1.19, 2.29+ hỗ trợ Go 1.21 đến 1.24, và dải mới nhất được liệt kê, 2.41+, cần Go 1.24 hoặc 1.25, theo bảng tương thích trong README. Tài liệu đầy đủ nằm tại clickhouse.com/docs/en/integrations/go.

Ví Dụ Kết Nối Và Truy Vấn

Mở một kết nối native nghĩa là dựng một struct clickhouse.Options — địa chỉ, Auth (Database/Username/Password), và tuỳ chọn Settings, Compression, timeout — rồi gọi clickhouse.Open(&options) và conn.Ping(ctx) để xác nhận kết nối được: ```go conn, err := clickhouse.Open(&clickhouse.Options{ Addr: []string{"127.0.0.1:9000"}, Auth: clickhouse.Auth{ Database: "default", Username: "default", Password: "", }, }) if err != nil { return err } return conn.Ping(context.Background()) ``` Với database/sql, clickhouse.OpenDB(&options) trả về một *sql.DB mà bạn cấu hình theo cách thông thường, bằng SetMaxIdleConns, SetMaxOpenConns, và SetConnMaxLifetime. Một chuỗi DSN cũng dùng được — `clickhouse://user:pass@host1:9000,host2:9000/database?dial_timeout=200ms&read_timeout=30s` — và các tham số query như compress, secure, connection_open_strategy ánh xạ trực tiếp sang các field của Options. Ghi hàng loạt đi qua PrepareBatch ở interface native, hoặc theo mẫu begin→prepare→exec-trong-vòng-lặp→commit với database/sql.

Điểm mạnh

  • ✓Interface native và database/sql nằm trong cùng một package, nên chuyển từ cái này sang cái kia không có nghĩa là phải dùng một driver khác.
  • ✓Connection pool, failover, và load balancing (in_order, round_robin, random) có sẵn và cấu hình được qua struct Options hoặc tham số query trong DSN.
  • ✓Nén thực sự đa dạng — LZ4, ZSTD, LZ4HC, GZIP, Deflate, và Brotli đều được hỗ trợ, với nén block native và nén web HTTP được giữ như hai lớp riêng biệt, rõ ràng thay vì một cờ mờ nhạt.
  • ✓Cấu hình TLS dùng trực tiếp tls.Config chuẩn của Go, nên chuỗi chứng chỉ, SNI, và cipher suite được cấu hình theo cách Go thông thường thay vì qua một lớp trừu tượng riêng của driver.
  • ✓Giấy phép Apache-2.0, không ràng buộc bản quyền độc quyền.

Đánh Đổi Giữa Các Interface Và Tính Năng Thử Nghiệm

  • △Các method định dạng input/output tuỳ ý (QueryFormat/InsertFormat cho CSV thô, JSONEachRow, Parquet, và tương tự) được README gắn nhãn thử nghiệm và có thể thay đổi hoặc bị gỡ bỏ ở một bản minor sau này.
  • △Các method stream định dạng thô đó chỉ hoạt động qua HTTP — giao thức TCP native trả về ErrFormatNativeUnsupported cho chúng, nên muốn vừa có query native nhanh vừa stream định dạng thô thì phải dùng hai kiểu kết nối.
  • △Khả năng tương thích database/sql đi kèm cái giá hiệu năng được ghi rõ: chính phần benchmark của README gọi nó chậm hơn interface native, nên đây là một đánh đổi thật, không phải tiện ích miễn phí.
  • △API AsyncInsert() cũ và các tuỳ chọn logging Debug/Debugf đã deprecated, thay bằng WithAsync() và field Logger, nên code viết theo API cũ cần cập nhật.
  • △Nén có những điểm cần cẩn thận: README cảnh báo bật cùng lúc cả nén web HTTP lẫn nén block native có thể lãng phí CPU khi nén lại các block đã nén sẵn.

Chọn Giữa Interface Native Và `database/sql`

Interface native (clickhouse.Open) — khuyến nghị của chính README khi bạn phân vân: encode column trực tiếp qua ch-go, truy cập các tính năng chỉ có ở driver.Conn như PrepareBatch và query format, và là đường nhanh hơn trong benchmark của dự án.Interface database/sql (clickhouse.OpenDB) — lựa chọn đúng khi bạn đã chuẩn hoá theo công cụ database/sql, migration, hoặc một ORM và không muốn bảo trì thêm một API riêng của driver.Transport TCP native — mặc định ít overhead hơn cho cả hai interface khi bạn kết nối thẳng tới ClickHouse mà không có gì ở giữa.Transport HTTP — chọn khi cần đi qua một proxy như ChProxy hoặc một load balancer hiểu HTTP; cả hai interface đều hỗ trợ, và dữ liệu định dạng native vẫn có thể truyền qua HTTP.

Câu Hỏi Thường Gặp

clickhouse-go hỗ trợ những phiên bản ClickHouse nào?

ClickHouse Go Driver được test với các phiên bản ClickHouse đang được hỗ trợ hiện hành, theo dõi qua file SECURITY.md của dự án ClickHouse, thay vì gắn cố định vào một danh sách phiên bản.

clickhouse-go tương thích với những phiên bản Go nào?

Hỗ trợ Go của ClickHouse Go Driver đi theo phiên bản của chính client: 2.0-2.2 cần Go 1.17/1.18, 2.3+ cần 1.18.4+/1.19, 2.29+ hỗ trợ Go 1.21 đến 1.24, và 2.41+ cần Go 1.24 hoặc 1.25, theo bảng tương thích trong README.

Sự khác biệt về hiệu năng giữa interface native và `database/sql` là gì?

Interface native của ClickHouse Go Driver nhanh hơn vì encode column trực tiếp, còn interface database/sql chậm hơn theo chính phần benchmark của dự án — README khuyên dùng native cho công việc nhạy cảm về hiệu năng.

clickhouse-go có hỗ trợ kết nối TLS/SSL bảo mật không?

ClickHouse Go Driver hỗ trợ TLS/SSL trên cả ba đường kết nối — DSN, OpenDB, và Open — dùng tls.Config chuẩn của Go, và hai tham số secure, skip_verify trong DSN đều mặc định là false, nghĩa là xác thực chứng chỉ được bật theo mặc định.

Tôi có thể dùng giao thức HTTP với ClickHouse Go driver không?

ClickHouse Go Driver hỗ trợ HTTP trên cả hai interface: dùng DSN dạng http:// hoặc đặt Protocol: clickhouse.HTTP trong struct Options, và dữ liệu định dạng native vẫn truyền được qua HTTP để dùng với proxy như ChProxy.

ClickHouse Go driver được phát hành theo giấy phép nào?

ClickHouse Go Driver được phát hành theo giấy phép Apache-2.0, như được liệt kê trên GitHub repository của nó.

Vấn đề ClickHouse Go Driver giải quyết

Mọi ứng dụng Go giao tiếp với ClickHouse đều phải chọn một giao thức truyền tải và một kiểu API trước khi viết query đầu tiên, và chọn sai sẽ trả giá bằng throughput thực tế hoặc buộc phải viết lại sau này. README giải quyết thẳng vấn đề này bằng bảng so sánh "Which interface should I use?" của riêng nó — một driver.Conn dành riêng cho ClickHouse để encode column trực tiếp, hoặc một driver tương thích database/sql cho công cụ sẵn có — thay vì chỉ cung cấp một driver SQL chung chung rồi để bạn tự phát hiện đánh đổi đó qua một benchmark sau này.

Trường hợp sử dụng tốt nhất

  • •Xây dựng một service Go mới ghi vào hoặc query ClickHouse và muốn đường đi nhanh nhất — README khuyên dùng interface native driver.Conn với cách encode column trực tiếp khi bạn phân vân.
  • •Thêm ClickHouse vào một codebase đã xây trên công cụ database/sql hoặc một ORM, qua clickhouse.OpenDB, mà không cần đưa thêm một API driver riêng thứ hai vào.
  • •Stream bulk insert hoặc export ở định dạng gốc của server — QueryFormat/InsertFormat truyền thẳng CSV, JSONEachRow, hoặc Parquet mà driver không encode lại.
  • •Kết nối qua một HTTP proxy hoặc load balancer như ChProxy, vì định dạng native có thể truyền qua transport HTTP cũng như TCP thô.
  • •Chạy insert bất đồng bộ, không chặn, qua WithAsync() trong các pipeline ghi nhiều dữ liệu mà không cần từng insert được xác nhận trước khi tiếp tục.

Ai nên dùng — và ai nên bỏ qua

Hãy dùng ClickHouse Go Driver nếu bạn viết code Go mới cho ClickHouse và muốn truy cập trực tiếp các tính năng giao thức native — connection pool, failover, lựa chọn nén, và API driver.Conn — mà không đi qua database/sql. Dùng riêng interface database/sql, nhưng vẫn giữ cùng driver, nếu bạn gắn ClickHouse vào một codebase hoặc ORM dựa trên database/sql sẵn có và chấp nhận đánh đổi một phần throughput để lấy khả năng tương thích, theo đúng so sánh benchmark của dự án. Bỏ qua toàn bộ package nếu bạn cần một client ở ngôn ngữ khác ngoài Go.

Repo liên quan

Nguồn & ghi công

Thông tin và ví dụ code lấy từ repository GitHub ClickHouse/clickhouse-go và README của nó.

Dữ liệu GitHub · đồng bộ lần cuối 12 thg 8, 2026Đánh giá bởi Henry
← Về TopGit

Chưa chắc clickhouse-go có hợp với bạn?

Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về clickhouse-go.

GitHub