@clickzetta/cz-cli-darwin-arm64 0.3.19 → 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/bin/cz-cli +0 -0
  2. package/bin/skills/clickzetta-access-control/eval_cases.jsonl +1 -1
  3. package/bin/skills/clickzetta-batch-sync-pipeline/eval_cases.jsonl +5 -0
  4. package/bin/skills/clickzetta-cdc-sync-pipeline/eval_cases.jsonl +5 -0
  5. package/bin/skills/clickzetta-dba-guide/SKILL.md +542 -0
  6. package/bin/skills/clickzetta-dba-guide/eval_cases.jsonl +3 -0
  7. package/bin/skills/clickzetta-dw-modeling/eval_cases.jsonl +1 -1
  8. package/bin/skills/clickzetta-dynamic-table/eval_cases.jsonl +5 -0
  9. package/bin/skills/clickzetta-file-import-pipeline/eval_cases.jsonl +5 -0
  10. package/bin/skills/clickzetta-lakehouse-connect/SKILL.md +218 -0
  11. package/bin/skills/clickzetta-lakehouse-connect/eval_cases.jsonl +3 -0
  12. package/bin/skills/clickzetta-lakehouse-connect/evals/evals.json +35 -0
  13. package/bin/skills/clickzetta-lakehouse-connect/references/config-file.md +435 -0
  14. package/bin/skills/clickzetta-lakehouse-connect/references/jdbc.md +478 -0
  15. package/bin/skills/clickzetta-lakehouse-connect/references/python-sdk.md +225 -0
  16. package/bin/skills/clickzetta-lakehouse-connect/references/sqlalchemy.md +468 -0
  17. package/bin/skills/clickzetta-lakehouse-connect/references/zettapark-session.md +445 -0
  18. package/bin/skills/clickzetta-manage-comments/SKILL.md +219 -0
  19. package/bin/skills/clickzetta-manage-comments/eval_cases.jsonl +3 -0
  20. package/bin/skills/clickzetta-metadata/SKILL.md +483 -0
  21. package/bin/skills/clickzetta-metadata/eval_cases.jsonl +5 -0
  22. package/bin/skills/clickzetta-metadata/references/instance-views-reference.md +276 -0
  23. package/bin/skills/clickzetta-metadata/references/metering-views-reference.md +137 -0
  24. package/bin/skills/clickzetta-metadata/references/show-desc-reference.md +326 -0
  25. package/bin/skills/clickzetta-metadata/references/views-reference.md +271 -0
  26. package/bin/skills/clickzetta-oss-ingest-pipeline/eval_cases.jsonl +5 -0
  27. package/bin/skills/clickzetta-overview/SKILL.md +102 -0
  28. package/bin/skills/clickzetta-overview/eval_cases.jsonl +5 -0
  29. package/bin/skills/clickzetta-overview/references/brands-and-endpoints.md +79 -0
  30. package/bin/skills/clickzetta-overview/references/object-model.md +311 -0
  31. package/bin/skills/clickzetta-overview/references/studio-modules.md +173 -0
  32. package/bin/skills/clickzetta-realtime-sync-pipeline/eval_cases.jsonl +5 -0
  33. package/bin/skills/clickzetta-sql-pipeline-manager/eval_cases.jsonl +12 -0
  34. package/bin/skills/clickzetta-table-stream-pipeline/eval_cases.jsonl +5 -0
  35. package/bin/skills/clickzetta-vcluster-manager/eval_cases.jsonl +5 -0
  36. package/bin/skills/clickzetta-volume-manager/eval_cases.jsonl +5 -0
  37. package/bin/skills/cz-cli-inner/SKILL.md +5 -4
  38. package/package.json +1 -1
  39. package/bin/skills/clickzetta-data-ingest-pipeline/SKILL.md +0 -220
  40. package/bin/skills/clickzetta-data-ingest-pipeline/eval_cases.jsonl +0 -5
@@ -0,0 +1,468 @@
1
+ # SQLAlchemy 连接器详细参考
2
+
3
+ > **包名**: `clickzetta-sqlalchemy`(依赖 `clickzetta-connector-python`)
4
+ > **Python 版本**: 推荐 **Python 3.12**(最低 3.10,不支持 3.9 及以下)
5
+ > **返回**: [ClickZetta 连接主指南](../SKILL.md)
6
+
7
+ ## 目录
8
+
9
+ 1. [安装](#1-安装)
10
+ 2. [连接 URL 格式](#2-连接-url-格式)
11
+ 3. [基础用法 — create_engine](#3-基础用法--create_engine)
12
+ 4. [特殊字符处理](#4-特殊字符处理)
13
+ 5. [connect_args 参数](#5-connect_args-参数)
14
+ 6. [连接池配置](#6-连接池配置)
15
+ 7. [完整生产配置示例](#7-完整生产配置示例)
16
+ 8. [与 LangChain 集成](#8-与-langchain-集成)
17
+ 9. [与 Apache Superset 集成](#9-与-apache-superset-集成)
18
+ 10. [常见操作示例](#10-常见操作示例)
19
+ 11. [适用场景](#11-适用场景)
20
+ 12. [与 Python SDK 的区别](#12-与-python-sdk-的区别)
21
+ 13. [常见问题](#13-常见问题)
22
+ 14. [相关文档](#14-相关文档)
23
+
24
+ ---
25
+
26
+ ## 1. 安装
27
+
28
+ ```bash
29
+ pip install clickzetta-connector-python clickzetta-sqlalchemy
30
+ ```
31
+
32
+ 验证安装:
33
+
34
+ ```python
35
+ from sqlalchemy import create_engine
36
+ import clickzetta.connector # 确认 connector 可用
37
+ print("SQLAlchemy + ClickZetta connector ready")
38
+ ```
39
+
40
+ ---
41
+
42
+ ## 2. 连接 URL 格式
43
+
44
+ ClickZetta SQLAlchemy 连接 URL 遵循以下格式:
45
+
46
+ ```
47
+ clickzetta://{username}:{password}@{service}/{workspace}?instance={instance}&schema={schema}&vcluster={vcluster}
48
+ ```
49
+
50
+ | 组成部分 | 说明 | 示例 |
51
+ |----------|------|------|
52
+ | `clickzetta://` | 协议前缀(dialect) | 固定值 |
53
+ | `{username}` | 用户名(需 URL 编码) | `my_user` |
54
+ | `{password}` | 密码(需 URL 编码) | `MyP%40ssw0rd%21` |
55
+ | `@{service}` | 服务地址(含区域前缀) | `cn-shanghai-alicloud.api.clickzetta.com` |
56
+ | `/{workspace}` | 工作空间(对应数据库) | `my_workspace` |
57
+ | `?instance=` | 实例名称 | `my_instance` |
58
+ | `&schema=` | Schema 名称 | `public` |
59
+ | `&vcluster=` | 虚拟集群名称(必填) | `default_ap` |
60
+
61
+ ---
62
+
63
+ ## 3. 基础用法 — create_engine
64
+
65
+ ```python
66
+ from urllib.parse import quote_plus
67
+ from sqlalchemy import create_engine, text
68
+
69
+ # ⚠️ 用户名和密码中的特殊字符必须 URL 编码
70
+ password = quote_plus("MyP@ssw0rd!")
71
+ username = quote_plus("my_user")
72
+
73
+ url = (
74
+ f"clickzetta://{username}:{password}"
75
+ f"@your-region.api.clickzetta.com" # 按实例所在区域填写,参见 SKILL.md 区域地址表
76
+ f"/my_workspace"
77
+ f"?instance=my_instance"
78
+ f"&schema=public"
79
+ f"&vcluster=default_ap"
80
+ )
81
+
82
+ engine = create_engine(url)
83
+
84
+ # 执行查询
85
+ with engine.connect() as conn:
86
+ result = conn.execute(text("SELECT * FROM my_table LIMIT 10"))
87
+ for row in result:
88
+ print(row)
89
+ ```
90
+
91
+ ---
92
+
93
+ ## 4. 特殊字符处理
94
+
95
+ 用户名或密码中包含 `@`、`/`、`:`、`?`、`#`、`%` 等特殊字符时,**必须**使用 `urllib.parse.quote_plus()` 进行 URL 编码,否则会导致 URL 解析失败。
96
+
97
+ ```python
98
+ from urllib.parse import quote_plus
99
+
100
+ # 原始密码: P@ss/w0rd#123
101
+ password_encoded = quote_plus("P@ss/w0rd#123")
102
+ # 编码后: P%40ss%2Fw0rd%23123
103
+
104
+ username_encoded = quote_plus("user@domain.com")
105
+ # 编码后: user%40domain.com
106
+ ```
107
+
108
+ > **常见错误**: 直接拼接含 `@` 的密码会导致 SQLAlchemy 将密码中的 `@` 误认为 host 分隔符。
109
+
110
+ ---
111
+
112
+ ## 5. connect_args 参数
113
+
114
+ 通过 `connect_args` 传递超时时间和性能提示(hints):
115
+
116
+ ```python
117
+ engine = create_engine(
118
+ url,
119
+ connect_args={
120
+ "timeout": 300, # 连接超时(秒)
121
+ "hints": {
122
+ "sdk.job.timeout": 300,
123
+ "query_tag": "analytics",
124
+ "cz.storage.parquet.vector.index.read.memory.cache": "true",
125
+ "cz.storage.parquet.vector.index.read.local.cache": "false",
126
+ "cz.sql.table.scan.push.down.filter": "true",
127
+ "cz.sql.table.scan.enable.ensure.filter": "true",
128
+ "cz.storage.always.prefetch.internal": "true",
129
+ "cz.optimizer.generate.columns.always.valid": "true",
130
+ "cz.sql.index.prewhere.enabled": "true",
131
+ },
132
+ },
133
+ )
134
+ ```
135
+
136
+ > 以上 hints 参数来自 `langchain-clickzetta/libs/clickzetta/langchain_clickzetta/engine.py` 中的默认性能优化配置。
137
+
138
+ ---
139
+
140
+ ## 6. 连接池配置
141
+
142
+ ```python
143
+ engine = create_engine(
144
+ url,
145
+ pool_pre_ping=True, # 每次取连接前检测连接是否有效
146
+ pool_recycle=3600, # 每小时回收连接(避免服务端超时断开)
147
+ pool_size=5, # 连接池常驻连接数
148
+ max_overflow=10, # 允许的溢出连接数(峰值 = pool_size + max_overflow)
149
+ )
150
+ ```
151
+
152
+ | 参数 | 默认值 | 说明 |
153
+ |------|--------|------|
154
+ | `pool_pre_ping` | `False` | 取连接前发送测试查询,检测连接是否存活 |
155
+ | `pool_recycle` | `-1` | 连接回收间隔(秒),建议设为 `3600` |
156
+ | `pool_size` | `5` | 连接池常驻连接数 |
157
+ | `max_overflow` | `10` | 超出 `pool_size` 后允许的临时连接数 |
158
+ | `pool_timeout` | `30` | 等待可用连接的超时时间(秒) |
159
+
160
+ ---
161
+
162
+ ## 7. 完整生产配置示例
163
+
164
+ ```python
165
+ from urllib.parse import quote_plus
166
+ from sqlalchemy import create_engine, text
167
+
168
+ password = quote_plus("MyP@ssw0rd!")
169
+ username = quote_plus("my_user")
170
+
171
+ url = (
172
+ f"clickzetta://{username}:{password}"
173
+ f"@your-region.api.clickzetta.com" # 按实例所在区域填写,参见 SKILL.md 区域地址表
174
+ f"/my_workspace"
175
+ f"?instance=my_instance"
176
+ f"&schema=public"
177
+ f"&vcluster=default_ap"
178
+ )
179
+
180
+ engine = create_engine(
181
+ url,
182
+ connect_args={
183
+ "timeout": 300,
184
+ "hints": {
185
+ "sdk.job.timeout": 300,
186
+ "query_tag": "production_analytics",
187
+ },
188
+ },
189
+ pool_pre_ping=True,
190
+ pool_recycle=3600,
191
+ pool_size=5,
192
+ max_overflow=10,
193
+ )
194
+
195
+ # 执行查询
196
+ with engine.connect() as conn:
197
+ result = conn.execute(text("SELECT COUNT(*) FROM orders"))
198
+ count = result.scalar()
199
+ print(f"Total orders: {count}")
200
+
201
+ # 使用完毕后释放连接池
202
+ engine.dispose()
203
+ ```
204
+
205
+ ---
206
+
207
+ ## 8. 与 LangChain 集成
208
+
209
+ `langchain-clickzetta` 包提供了 `ClickZettaEngine` 类,内部封装了 SQLAlchemy 引擎的创建和管理。无需手动构建 URL。
210
+
211
+ ```python
212
+ from langchain_clickzetta import ClickZettaEngine
213
+
214
+ # 使用 7 个必填参数初始化
215
+ engine = ClickZettaEngine(
216
+ service="your-region.api.clickzetta.com", # 按实例所在区域填写,参见 SKILL.md 区域地址表
217
+ instance="my_instance",
218
+ workspace="my_workspace",
219
+ schema="public",
220
+ username="my_user",
221
+ password="my_password",
222
+ vcluster="default_ap",
223
+ connection_timeout=30, # 可选
224
+ query_timeout=300, # 可选
225
+ )
226
+
227
+ # 方式 1: 使用内置查询方法(推荐)
228
+ results, columns = engine.execute_query("SELECT * FROM my_table LIMIT 5")
229
+ for row in results:
230
+ print(row) # dict 格式: {"col1": val1, "col2": val2, ...}
231
+
232
+ # 方式 2: 获取底层 SQLAlchemy Engine 对象
233
+ sa_engine = engine.get_sqlalchemy_engine()
234
+ with sa_engine.connect() as conn:
235
+ result = conn.execute(text("SELECT 1"))
236
+ print(result.fetchone())
237
+
238
+ # 方式 3: 使用 SQLAlchemy 引擎执行查询
239
+ results = engine.execute_sql_with_engine("SELECT COUNT(*) FROM orders")
240
+ print(results) # [{"count": 12345}]
241
+
242
+ # 关闭连接
243
+ engine.close()
244
+ ```
245
+
246
+ ### ClickZettaEngine 内部 URL 构建逻辑
247
+
248
+ `ClickZettaEngine.get_sqlalchemy_engine()` 内部按以下方式构建连接 URL:
249
+
250
+ ```python
251
+ # 来自 langchain-clickzetta/libs/clickzetta/langchain_clickzetta/engine.py
252
+ from urllib.parse import quote_plus
253
+
254
+ password_encoded = quote_plus(password)
255
+ username_encoded = quote_plus(username)
256
+
257
+ url_parts = [
258
+ f"clickzetta://{username_encoded}:{password_encoded}",
259
+ f"@{service}",
260
+ f"/{workspace}",
261
+ f"?instance={instance}",
262
+ f"&schema={schema}",
263
+ f"&vcluster={vcluster}",
264
+ ]
265
+ connection_url = "".join(url_parts)
266
+
267
+ engine = create_engine(
268
+ connection_url,
269
+ connect_args={
270
+ "timeout": connection_timeout,
271
+ "hints": hints,
272
+ },
273
+ pool_pre_ping=True,
274
+ pool_recycle=3600,
275
+ )
276
+ ```
277
+
278
+ ### 支持上下文管理器
279
+
280
+ ```python
281
+ with ClickZettaEngine(
282
+ service="your-region.api.clickzetta.com", # 按实例所在区域填写,参见 SKILL.md 区域地址表
283
+ instance="my_instance",
284
+ workspace="my_workspace",
285
+ schema="public",
286
+ username="my_user",
287
+ password="my_password",
288
+ vcluster="default_ap",
289
+ ) as engine:
290
+ results, columns = engine.execute_query("SELECT 1 AS test")
291
+ print(results)
292
+ # 退出 with 块时自动关闭连接
293
+ ```
294
+
295
+ ---
296
+
297
+ ## 9. 与 Apache Superset 集成
298
+
299
+ ### 9.1 Superset 连接配置
300
+
301
+ 在 Superset 中添加 ClickZetta 数据源时,使用以下 SQLAlchemy URI:
302
+
303
+ ```
304
+ clickzetta://{username}:{password}@{service}/{workspace}?instance={instance}&schema={schema}&vcluster={vcluster}
305
+ ```
306
+
307
+ > 在 Superset UI 的 "Database" → "Add Database" → "SQLAlchemy URI" 字段中填入上述格式。
308
+
309
+ ### 9.2 Superset Engine Spec
310
+
311
+ ClickZetta 为 Superset 提供了专用的 Engine Spec(`ClickZettaEngineSpec`),支持以下特性:
312
+
313
+ | 特性 | 说明 |
314
+ |------|------|
315
+ | `engine = "clickzetta"` | 引擎标识符 |
316
+ | `LimitMethod.WRAP_SQL` | 使用子查询包装方式添加 LIMIT |
317
+ | 自动去除反引号 | 通过 monkey-patch 禁用 dialect 的反引号引用 |
318
+ | 时间粒度表达式 | 支持 `DATE_TRUNC('SECOND'/'MINUTE'/'HOUR'/'DAY'/'WEEK'/'MONTH'/'YEAR', col)` |
319
+ | Schema 预查询 | 自动执行 `USE SCHEMA {schema}` 设置上下文 |
320
+
321
+ ```python
322
+ # 来自 superset/superset/db_engine_specs/clickzetta.py
323
+
324
+ class ClickZettaEngineSpec(BaseEngineSpec):
325
+ engine = "clickzetta"
326
+ engine_name = "ClickZetta"
327
+ disable_ssh_tunneling = True
328
+ limit_method = LimitMethod.WRAP_SQL
329
+
330
+ _time_grain_expressions = {
331
+ None: "{col}",
332
+ "PT1S": "DATE_TRUNC('SECOND', {col})",
333
+ "PT1M": "DATE_TRUNC('MINUTE', {col})",
334
+ "PT1H": "DATE_TRUNC('HOUR', {col})",
335
+ "P1D": "DATE_TRUNC('DAY', {col})",
336
+ "P1W": "DATE_TRUNC('WEEK', {col})",
337
+ "P1M": "DATE_TRUNC('MONTH', {col})",
338
+ "P1Y": "DATE_TRUNC('YEAR', {col})",
339
+ }
340
+ ```
341
+
342
+ ### 9.3 反引号问题
343
+
344
+ ClickZetta SQL 原生支持反引号(`` ` ``)作为标识符引用(官方文档有明确说明)。但 SQLAlchemy ORM 自动生成的反引号在某些场景下可能与 ClickZetta dialect 不兼容。Superset 的 Engine Spec 通过 monkey-patch 移除反引号以确保兼容性:
345
+
346
+ ```python
347
+ # 来自 superset/superset/db_engine_specs/clickzetta.py
348
+ class NoQuoteIdentifierPreparer(original_preparer):
349
+ def quote(self, ident, force=None):
350
+ return ident # 不加引号,直接返回标识符
351
+
352
+ def quote_identifier(self, value):
353
+ return value
354
+ ```
355
+
356
+ 同时,所有 SQL 语句在执行前会通过事件监听器清理反引号:
357
+
358
+ ```python
359
+ @event.listens_for(engine, "before_cursor_execute", retval=True)
360
+ def remove_backticks_from_statement(conn, cursor, statement, parameters, context, executemany):
361
+ cleaned_statement = re.sub(r'`([^`]+)`', r'\1', statement)
362
+ return cleaned_statement, parameters
363
+ ```
364
+
365
+ ---
366
+
367
+ ## 10. 常见操作示例
368
+
369
+ ### 10.1 查询数据
370
+
371
+ ```python
372
+ with engine.connect() as conn:
373
+ # 简单查询
374
+ result = conn.execute(text("SELECT * FROM customers LIMIT 10"))
375
+ rows = result.fetchall()
376
+ columns = result.keys()
377
+
378
+ # 参数化查询
379
+ result = conn.execute(
380
+ text("SELECT * FROM orders WHERE status = :status"),
381
+ {"status": "completed"}
382
+ )
383
+ for row in result:
384
+ print(dict(row))
385
+ ```
386
+
387
+ ### 10.2 DDL 操作
388
+
389
+ ```python
390
+ with engine.connect() as conn:
391
+ conn.execute(text("""
392
+ CREATE TABLE IF NOT EXISTS analytics_events (
393
+ event_id STRING,
394
+ event_type STRING,
395
+ user_id BIGINT,
396
+ event_time TIMESTAMP,
397
+ properties STRING
398
+ )
399
+ """))
400
+ conn.commit()
401
+ ```
402
+
403
+ ### 10.3 结合 Pandas 使用
404
+
405
+ ```python
406
+ import pandas as pd
407
+
408
+ # 读取数据到 DataFrame
409
+ df = pd.read_sql("SELECT * FROM sales_data LIMIT 1000", engine)
410
+ print(df.describe())
411
+
412
+ # 将 DataFrame 写入表(需要表已存在)
413
+ df.to_sql("sales_summary", engine, if_exists="append", index=False)
414
+ ```
415
+
416
+ ---
417
+
418
+ ## 11. 适用场景
419
+
420
+ | 场景 | 说明 |
421
+ |------|------|
422
+ | **ORM 集成** | Django、Flask-SQLAlchemy 等框架通过 SQLAlchemy 连接 ClickZetta |
423
+ | **BI 工具** | Apache Superset、Metabase 等通过 SQLAlchemy URI 连接 |
424
+ | **LangChain 集成** | `langchain-clickzetta` 内部使用 SQLAlchemy 引擎执行 SQL Chain、Vector Store 操作 |
425
+ | **ETL 管道** | 使用 SQLAlchemy 作为统一数据库接口,配合 Pandas、dbt 等工具 |
426
+ | **数据分析** | 结合 Pandas `read_sql()` 快速获取数据进行分析 |
427
+
428
+ ---
429
+
430
+ ## 12. 与 Python SDK 的区别
431
+
432
+ | 维度 | Python SDK (`clickzetta.connect()`) | SQLAlchemy (`create_engine()`) |
433
+ |------|--------------------------------------|--------------------------------|
434
+ | 返回对象 | `Session`(连接对象) | `Engine`(引擎 + 连接池) |
435
+ | 连接管理 | 手动管理单连接 | 自动连接池管理 |
436
+ | 查询方式 | `cursor.execute()` + `fetchall()` | `conn.execute(text(...))` |
437
+ | 参数化查询 | `cursor.execute(sql, params)` | `conn.execute(text(sql), params)` |
438
+ | 生态兼容 | 仅 ClickZetta SDK | 兼容所有 SQLAlchemy 生态工具 |
439
+ | 适用场景 | 轻量脚本、ETL | ORM、BI 工具、LangChain |
440
+
441
+ ---
442
+
443
+ ## 13. 常见问题
444
+
445
+ ### Q: `create_engine` 后连接失败?
446
+ 检查以下几点:
447
+ 1. `clickzetta-sqlalchemy` 是否已安装
448
+ 2. 密码中的特殊字符是否已用 `quote_plus()` 编码
449
+ 3. 7 个必填参数(service、instance、workspace、schema、username、password、vcluster)是否完整
450
+ 4. 网络是否可达 service 地址
451
+
452
+ ### Q: 查询报错 "backtick not supported"?
453
+ ClickZetta SQL 原生支持反引号标识符,但 SQLAlchemy ORM 自动生成的反引号在某些场景下可能引发兼容性问题。如遇此报错,可像 Superset Engine Spec 那样 patch dialect 移除反引号,或在建表时避免使用保留字作为列名。
454
+
455
+ ### Q: 如何在长时间运行的应用中保持连接?
456
+ 设置 `pool_pre_ping=True` 和 `pool_recycle=3600`,确保连接池中的连接不会因服务端超时而失效。
457
+
458
+ ### Q: `execute_sql_with_engine` 和 `execute_query` 有什么区别?
459
+ - `execute_query`: 使用 ClickZetta 原生 Session + Cursor 执行,性能更好
460
+ - `execute_sql_with_engine`: 使用 SQLAlchemy Engine 执行,兼容性更好
461
+
462
+ ---
463
+
464
+ ## 14. 相关文档
465
+
466
+ - [Python SDK 参考](python-sdk.md) — 原生 `clickzetta.connect()` 用法
467
+ - [ZettaPark Session 参考](zettapark-session.md) — DataFrame API 用法
468
+ - [配置文件管理](config-file.md) — `connections.json` 统一管理连接参数