sqlseed 0.1.10__tar.gz → 0.1.11__tar.gz
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.
- {sqlseed-0.1.10 → sqlseed-0.1.11}/.gitignore +4 -3
- {sqlseed-0.1.10 → sqlseed-0.1.11}/CHANGELOG.md +6 -1
- {sqlseed-0.1.10 → sqlseed-0.1.11}/PKG-INFO +104 -100
- {sqlseed-0.1.10 → sqlseed-0.1.11}/README.md +102 -99
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/mcp-server-sqlseed/src/mcp_server_sqlseed/server.py +53 -27
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/README.md +3 -3
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/src/sqlseed_ai/__init__.py +17 -32
- sqlseed-0.1.11/plugins/sqlseed-ai/src/sqlseed_ai/_client.py +23 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/src/sqlseed_ai/analyzer.py +36 -62
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/src/sqlseed_ai/config.py +2 -2
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/src/sqlseed_ai/errors.py +64 -32
- sqlseed-0.1.11/plugins/sqlseed-ai/src/sqlseed_ai/examples.py +183 -0
- sqlseed-0.1.11/plugins/sqlseed-ai/src/sqlseed_ai/provider.py +63 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/src/sqlseed_ai/refiner.py +68 -84
- {sqlseed-0.1.10 → sqlseed-0.1.11}/pyproject.toml +6 -2
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/__init__.py +10 -7
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/_utils/__init__.py +2 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/_utils/schema_helpers.py +10 -4
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/_utils/sql_safe.py +18 -5
- sqlseed-0.1.11/src/sqlseed/_version.py +3 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/cli/__init__.py +2 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/cli/main.py +158 -146
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/config/__init__.py +2 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/config/loader.py +2 -2
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/config/snapshot.py +2 -8
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/__init__.py +2 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/column_dag.py +49 -39
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/constraints.py +46 -20
- sqlseed-0.1.11/src/sqlseed/core/enrichment.py +161 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/expression.py +10 -10
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/mapper.py +59 -33
- sqlseed-0.1.11/src/sqlseed/core/orchestrator.py +467 -0
- sqlseed-0.1.11/src/sqlseed/core/plugin_mediator.py +162 -0
- sqlseed-0.1.11/src/sqlseed/core/relation.py +215 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/schema.py +43 -9
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/transform.py +7 -7
- sqlseed-0.1.11/src/sqlseed/core/unique_adjuster.py +142 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/database/__init__.py +2 -0
- sqlseed-0.1.11/src/sqlseed/database/_base_adapter.py +75 -0
- sqlseed-0.1.11/src/sqlseed/database/_compat.py +14 -0
- sqlseed-0.1.11/src/sqlseed/database/_helpers.py +72 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/database/_protocol.py +1 -1
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/database/optimizer.py +7 -6
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/database/raw_sqlite_adapter.py +23 -77
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/database/sqlite_utils_adapter.py +29 -82
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/generators/__init__.py +4 -1
- sqlseed-0.1.11/src/sqlseed/generators/_dispatch.py +41 -0
- sqlseed-0.1.11/src/sqlseed/generators/_json_helpers.py +47 -0
- sqlseed-0.1.11/src/sqlseed/generators/_protocol.py +22 -0
- sqlseed-0.1.11/src/sqlseed/generators/_string_helpers.py +31 -0
- sqlseed-0.1.11/src/sqlseed/generators/base_provider.py +355 -0
- sqlseed-0.1.11/src/sqlseed/generators/faker_provider.py +129 -0
- sqlseed-0.1.11/src/sqlseed/generators/mimesis_provider.py +144 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/generators/registry.py +42 -24
- sqlseed-0.1.11/src/sqlseed/generators/stream.py +180 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/plugins/__init__.py +2 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/plugins/hookspecs.py +12 -6
- sqlseed-0.1.10/plugins/sqlseed-ai/src/sqlseed_ai/_client.py +0 -31
- sqlseed-0.1.10/plugins/sqlseed-ai/src/sqlseed_ai/examples.py +0 -172
- sqlseed-0.1.10/plugins/sqlseed-ai/src/sqlseed_ai/nl_config.py +0 -80
- sqlseed-0.1.10/plugins/sqlseed-ai/src/sqlseed_ai/provider.py +0 -88
- sqlseed-0.1.10/plugins/sqlseed-ai/src/sqlseed_ai/suggest.py +0 -62
- sqlseed-0.1.10/src/sqlseed/_version.py +0 -1
- sqlseed-0.1.10/src/sqlseed/core/orchestrator.py +0 -851
- sqlseed-0.1.10/src/sqlseed/core/relation.py +0 -124
- sqlseed-0.1.10/src/sqlseed/generators/_protocol.py +0 -73
- sqlseed-0.1.10/src/sqlseed/generators/base_provider.py +0 -448
- sqlseed-0.1.10/src/sqlseed/generators/faker_provider.py +0 -157
- sqlseed-0.1.10/src/sqlseed/generators/mimesis_provider.py +0 -203
- sqlseed-0.1.10/src/sqlseed/generators/stream.py +0 -157
- {sqlseed-0.1.10 → sqlseed-0.1.11}/LICENSE +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/mcp-server-sqlseed/README.md +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/mcp-server-sqlseed/pyproject.toml +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/mcp-server-sqlseed/src/mcp_server_sqlseed/__init__.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/mcp-server-sqlseed/src/mcp_server_sqlseed/__main__.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/mcp-server-sqlseed/src/mcp_server_sqlseed/config.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/pyproject.toml +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/plugins/sqlseed-ai/src/sqlseed_ai/_json_utils.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/_utils/logger.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/_utils/metrics.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/_utils/progress.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/config/models.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/core/result.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/plugins/manager.py +0 -0
- {sqlseed-0.1.10 → sqlseed-0.1.11}/src/sqlseed/py.typed +0 -0
|
@@ -35,6 +35,7 @@ ENV/
|
|
|
35
35
|
# Testing
|
|
36
36
|
.pytest_cache/
|
|
37
37
|
.coverage
|
|
38
|
+
coverage.xml
|
|
38
39
|
htmlcov/
|
|
39
40
|
|
|
40
41
|
# Type checking
|
|
@@ -54,9 +55,6 @@ snapshots/
|
|
|
54
55
|
# AI cache
|
|
55
56
|
.sqlseed_cache/
|
|
56
57
|
|
|
57
|
-
# Archived temp files
|
|
58
|
-
_archived_temp/
|
|
59
|
-
|
|
60
58
|
# macOS
|
|
61
59
|
.DS_Store
|
|
62
60
|
|
|
@@ -67,3 +65,6 @@ _archived_temp/
|
|
|
67
65
|
dist/
|
|
68
66
|
*.whl
|
|
69
67
|
*.tar.gz
|
|
68
|
+
|
|
69
|
+
# Local git worktrees
|
|
70
|
+
.worktrees/
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
- `AIConfig` 可配置模型、API Key 和 Base URL
|
|
42
42
|
- 默认模型:`qwen3-coder-plus`,支持环境变量覆盖
|
|
43
43
|
- CLI `ai-suggest` 命令,AI 驱动的 YAML 生成
|
|
44
|
-
- 自然语言配置(`nl_config.py
|
|
44
|
+
- 自然语言配置(`nl_config.py`,已移除,功能由 `SchemaAnalyzer` + `AiConfigRefiner` 替代)
|
|
45
45
|
|
|
46
46
|
#### AI Evolution — 智能增强
|
|
47
47
|
- 结构化输出迁移:YAML → JSON,`response_format` 强制 JSON 输出
|
|
@@ -78,3 +78,8 @@
|
|
|
78
78
|
- 表达式引擎增加超时保护(默认 5 秒),防止无限循环
|
|
79
79
|
- 解决 `random.seed()` 类型异常(`rstr` 集成于流式生成器)
|
|
80
80
|
- `fill_from_config` 中 transform 属性正确传递到内部编排器
|
|
81
|
+
- `ProviderRegistry.register_from_entry_points()` 修正 provider 类与普通插件入口点的区分逻辑,非 provider 入口点(如 `sqlseed_ai:plugin`)不再产生误报 warning
|
|
82
|
+
|
|
83
|
+
### 变更
|
|
84
|
+
- 移除 `suggest.py`(`ColumnSuggester`)和 `nl_config.py`(`NLConfigGenerator`),其功能由 `SchemaAnalyzer` + `AiConfigRefiner` 完全替代。如有外部代码直接 `from sqlseed_ai.suggest import ColumnSuggester` 或 `from sqlseed_ai.nl_config import NLConfigGenerator`,将产生 `ImportError`
|
|
85
|
+
- `plugins/sqlseed-ai/README.md` 功能描述与当前实际入口对齐,移除未对外提供的 "Column-level Suggestions" / "Natural Language Config" 描述
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlseed
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.11
|
|
4
4
|
Summary: Declarative SQLite test data generation toolkit
|
|
5
5
|
Project-URL: Homepage, https://github.com/sunbos/sqlseed
|
|
6
6
|
Project-URL: Documentation, https://github.com/sunbos/sqlseed#readme
|
|
@@ -38,6 +38,7 @@ Provides-Extra: dev
|
|
|
38
38
|
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
39
39
|
Requires-Dist: pre-commit>=3.0; extra == 'dev'
|
|
40
40
|
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
41
|
+
Requires-Dist: pytest-benchmark>=4.0; extra == 'dev'
|
|
41
42
|
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
42
43
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
43
44
|
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
@@ -56,17 +57,17 @@ Description-Content-Type: text/markdown
|
|
|
56
57
|
|
|
57
58
|
### 声明式 SQLite 测试数据生成工具包
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
**一行代码,数万行数据。零配置智能生成,AI 驱动精准调优。**
|
|
60
61
|
|
|
61
62
|
[](https://github.com/sunbos/sqlseed/actions)
|
|
62
|
-
[](https://www.python.org/downloads/)
|
|
63
64
|
[](https://www.gnu.org/licenses/agpl-3.0)
|
|
64
65
|
[](https://github.com/astral-sh/ruff)
|
|
65
66
|
[](https://mypy-lang.org/)
|
|
66
67
|
|
|
67
68
|
</div>
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
***
|
|
70
71
|
|
|
71
72
|
```python
|
|
72
73
|
import sqlseed
|
|
@@ -77,21 +78,21 @@ print(result)
|
|
|
77
78
|
# → GenerationResult(table=users, count=100000, elapsed=2.34s, speed=42735 rows/s)
|
|
78
79
|
```
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
***
|
|
81
82
|
|
|
82
83
|
## 💡 为什么选择 sqlseed?
|
|
83
84
|
|
|
84
85
|
在开发和测试流程中,我们经常需要为 SQLite 数据库填充大量真实感的测试数据。传统方式要么手写冗长的数据生成脚本,要么使用难以维护的 SQL fixtures。sqlseed 用一种全新的声明式方式解决了这个问题:
|
|
85
86
|
|
|
86
|
-
| 特性
|
|
87
|
-
|
|
88
|
-
| 零配置智能生成
|
|
89
|
-
| 外键自动维护
|
|
90
|
-
| 10 万行 + 数据 |
|
|
91
|
-
| 列语义推断
|
|
92
|
-
| 可重复生成
|
|
93
|
-
| AI 智能调优
|
|
94
|
-
| 配置热重用
|
|
87
|
+
| 特性 | sqlseed | 手写脚本 | SQL Fixtures |
|
|
88
|
+
| :--------- | :-----: | :----: | :----------: |
|
|
89
|
+
| 零配置智能生成 | ✅ | ❌ | ❌ |
|
|
90
|
+
| 外键自动维护 | ✅ | 手动 | 手动 |
|
|
91
|
+
| 10 万行 + 数据 | ✅ 流式 | ⚠️ OOM | ❌ |
|
|
92
|
+
| 列语义推断 | ✅ 8 级策略 | ❌ | ❌ |
|
|
93
|
+
| 可重复生成 | ✅ seed | ⚠️ 手动 | ✅ |
|
|
94
|
+
| AI 智能调优 | ✅ LLM | ❌ | ❌ |
|
|
95
|
+
| 配置热重用 | ✅ YAML | ❌ | ❌ |
|
|
95
96
|
|
|
96
97
|
## ✨ 核心特性
|
|
97
98
|
|
|
@@ -162,7 +163,7 @@ print(result)
|
|
|
162
163
|
</tr>
|
|
163
164
|
</table>
|
|
164
165
|
|
|
165
|
-
|
|
166
|
+
***
|
|
166
167
|
|
|
167
168
|
## 📦 安装
|
|
168
169
|
|
|
@@ -217,7 +218,7 @@ mypy src/sqlseed/
|
|
|
217
218
|
|
|
218
219
|
</details>
|
|
219
220
|
|
|
220
|
-
|
|
221
|
+
***
|
|
221
222
|
|
|
222
223
|
## 🚀 快速开始
|
|
223
224
|
|
|
@@ -249,18 +250,19 @@ print(result)
|
|
|
249
250
|
```
|
|
250
251
|
|
|
251
252
|
sqlseed 会自动:
|
|
253
|
+
|
|
252
254
|
- ✅ 跳过 `id`(自增主键)
|
|
253
255
|
- ✅ 跳过 `is_active`(有默认值)
|
|
254
256
|
- ✅ `name` → 生成真实姓名
|
|
255
257
|
- ✅ `email` → 生成邮箱地址
|
|
256
|
-
- ✅ `age` → 生成 18
|
|
258
|
+
- ✅ `age` → 生成 18\~100 的整数
|
|
257
259
|
- ✅ `phone` → 生成电话号码
|
|
258
260
|
- ✅ `created_at` → 生成日期时间(匹配 `*_at` 模式)
|
|
259
261
|
- ✅ `balance` → 生成浮点数
|
|
260
262
|
|
|
261
263
|
**完全零配置,智能推断一切。**
|
|
262
264
|
|
|
263
|
-
|
|
265
|
+
***
|
|
264
266
|
|
|
265
267
|
## 📖 使用教程
|
|
266
268
|
|
|
@@ -298,36 +300,36 @@ print(result)
|
|
|
298
300
|
|
|
299
301
|
#### 支持的生成器类型
|
|
300
302
|
|
|
301
|
-
| 生成器
|
|
302
|
-
|
|
303
|
-
| `string`
|
|
304
|
-
| `integer`
|
|
305
|
-
| `float`
|
|
306
|
-
| `boolean`
|
|
307
|
-
| `name`
|
|
308
|
-
| `first_name`
|
|
309
|
-
| `last_name`
|
|
310
|
-
| `email`
|
|
311
|
-
| `phone`
|
|
312
|
-
| `address`
|
|
313
|
-
| `company`
|
|
314
|
-
| `url`
|
|
315
|
-
| `ipv4`
|
|
316
|
-
| `uuid`
|
|
317
|
-
| `date`
|
|
318
|
-
| `datetime`
|
|
319
|
-
| `timestamp`
|
|
320
|
-
| `text`
|
|
321
|
-
| `sentence`
|
|
322
|
-
| `password`
|
|
323
|
-
| `choice`
|
|
324
|
-
| `json`
|
|
325
|
-
| `pattern`
|
|
326
|
-
| `bytes`
|
|
327
|
-
| `foreign_key` | 外键引用
|
|
328
|
-
| `skip`
|
|
329
|
-
|
|
330
|
-
|
|
303
|
+
| 生成器 | 说明 | 参数示例 |
|
|
304
|
+
| :------------ | :------------- | :------------------------------------ |
|
|
305
|
+
| `string` | 随机字符串 | `min_length`, `max_length`, `charset` |
|
|
306
|
+
| `integer` | 整数 | `min_value`, `max_value` |
|
|
307
|
+
| `float` | 浮点数 | `min_value`, `max_value`, `precision` |
|
|
308
|
+
| `boolean` | 布尔值 | — |
|
|
309
|
+
| `name` | 人名 | — |
|
|
310
|
+
| `first_name` | 名 | — |
|
|
311
|
+
| `last_name` | 姓 | — |
|
|
312
|
+
| `email` | 邮箱 | — |
|
|
313
|
+
| `phone` | 电话 | — |
|
|
314
|
+
| `address` | 地址 | — |
|
|
315
|
+
| `company` | 公司名 | — |
|
|
316
|
+
| `url` | URL | — |
|
|
317
|
+
| `ipv4` | IPv4 地址 | — |
|
|
318
|
+
| `uuid` | UUID | — |
|
|
319
|
+
| `date` | 日期 | `start_year`, `end_year` |
|
|
320
|
+
| `datetime` | 日期时间 | `start_year`, `end_year` |
|
|
321
|
+
| `timestamp` | Unix 时间戳 | — |
|
|
322
|
+
| `text` | 长文本 | `min_length`, `max_length` |
|
|
323
|
+
| `sentence` | 句子 | — |
|
|
324
|
+
| `password` | 密码 | `length` |
|
|
325
|
+
| `choice` | 从列表选择 | `choices` |
|
|
326
|
+
| `json` | JSON 字符串 | `schema` |
|
|
327
|
+
| `pattern` | 正则匹配 | `regex` |
|
|
328
|
+
| `bytes` | 二进制数据 | `length` |
|
|
329
|
+
| `foreign_key` | 外键引用 | `ref_table`, `ref_column`, `strategy` |
|
|
330
|
+
| `skip` | 跳过(使用默认值/NULL) | — |
|
|
331
|
+
|
|
332
|
+
***
|
|
331
333
|
|
|
332
334
|
### 教程 2:多表关联 — 自动维持外键完整性
|
|
333
335
|
|
|
@@ -358,7 +360,7 @@ with sqlseed.connect("app.db", provider="mimesis", locale="zh_CN") as db:
|
|
|
358
360
|
|
|
359
361
|
> **💡 提示**:如果两张表之间有同名列(如 `account_id`),即使没有声明外键约束,sqlseed 也会通过 **SharedPool 隐式关联机制**自动维持跨表一致性。
|
|
360
362
|
|
|
361
|
-
|
|
363
|
+
***
|
|
362
364
|
|
|
363
365
|
### 教程 3:YAML 配置文件驱动批量生成
|
|
364
366
|
|
|
@@ -438,7 +440,7 @@ for r in results:
|
|
|
438
440
|
print(r)
|
|
439
441
|
```
|
|
440
442
|
|
|
441
|
-
|
|
443
|
+
***
|
|
442
444
|
|
|
443
445
|
### 教程 4:派生列与表达式引擎
|
|
444
446
|
|
|
@@ -476,6 +478,7 @@ tables:
|
|
|
476
478
|
```
|
|
477
479
|
|
|
478
480
|
**运作原理**:
|
|
481
|
+
|
|
479
482
|
1. sqlseed 构建列依赖 DAG:`card_number → last_eight, last_six`
|
|
480
483
|
2. 拓扑排序确定生成顺序
|
|
481
484
|
3. 先生成 `card_number`,再通过表达式 `value[-8:]` 计算 `last_eight`
|
|
@@ -483,26 +486,26 @@ tables:
|
|
|
483
486
|
|
|
484
487
|
#### 表达式引擎支持的函数
|
|
485
488
|
|
|
486
|
-
| 函数
|
|
487
|
-
|
|
488
|
-
| `upper(s)`
|
|
489
|
-
| `lower(s)`
|
|
490
|
-
| `len(s)`
|
|
491
|
-
| `substr(s, start, end)` | `substr(value, 0, 8)`
|
|
492
|
-
| `concat(*args)`
|
|
493
|
-
| `zfill(s, width)`
|
|
494
|
-
| `lpad(s, width, char)`
|
|
495
|
-
| `rpad(s, width, char)`
|
|
496
|
-
| `replace(s, old, new)`
|
|
497
|
-
| `strip(s)`
|
|
498
|
-
| `int(s)`
|
|
499
|
-
| `str(s)`
|
|
500
|
-
| 切片
|
|
501
|
-
| 数学
|
|
489
|
+
| 函数 | 用法 | 说明 |
|
|
490
|
+
| :---------------------- | :------------------------ | :---------- |
|
|
491
|
+
| `upper(s)` | `upper(value)` | 转大写 |
|
|
492
|
+
| `lower(s)` | `lower(value)` | 转小写 |
|
|
493
|
+
| `len(s)` | `len(value)` | 获取长度 |
|
|
494
|
+
| `substr(s, start, end)` | `substr(value, 0, 8)` | 子串 |
|
|
495
|
+
| `concat(*args)` | `concat("PRE_", value)` | 拼接 |
|
|
496
|
+
| `zfill(s, width)` | `zfill(value, 10)` | 零填充 |
|
|
497
|
+
| `lpad(s, width, char)` | `lpad(value, 8, "0")` | 左填充 |
|
|
498
|
+
| `rpad(s, width, char)` | `rpad(value, 8, "0")` | 右填充 |
|
|
499
|
+
| `replace(s, old, new)` | `replace(value, "-", "")` | 替换 |
|
|
500
|
+
| `strip(s)` | `strip(value)` | 去空白 |
|
|
501
|
+
| `int(s)` | `int(value)` | 转整数 |
|
|
502
|
+
| `str(s)` | `str(value)` | 转字符串 |
|
|
503
|
+
| 切片 | `value[-8:]` | Python 切片语法 |
|
|
504
|
+
| 数学 | `value * 2 + 1` | 基本数学运算 |
|
|
502
505
|
|
|
503
506
|
> ⚠️ **安全保护**:表达式引擎基于 `simpleeval`,具有 5 秒超时保护,不允许 `import`、`exec` 或文件 I/O 操作。
|
|
504
507
|
|
|
505
|
-
|
|
508
|
+
***
|
|
506
509
|
|
|
507
510
|
### 教程 5:Transform 脚本 — 极端业务逻辑
|
|
508
511
|
|
|
@@ -547,7 +550,7 @@ tables:
|
|
|
547
550
|
transform: "./transform_users.py"
|
|
548
551
|
```
|
|
549
552
|
|
|
550
|
-
|
|
553
|
+
***
|
|
551
554
|
|
|
552
555
|
### 教程 6:预览与调试
|
|
553
556
|
|
|
@@ -594,7 +597,7 @@ sqlseed inspect app.db --table users --show-mapping
|
|
|
594
597
|
# └────────────┴─────────┴──────────┴──────────────┴──────────────┘
|
|
595
598
|
```
|
|
596
599
|
|
|
597
|
-
|
|
600
|
+
***
|
|
598
601
|
|
|
599
602
|
### 教程 7:快照与回放
|
|
600
603
|
|
|
@@ -611,11 +614,12 @@ sqlseed replay snapshots/2026-04-15_033000_users.yaml
|
|
|
611
614
|
```
|
|
612
615
|
|
|
613
616
|
适用场景:
|
|
617
|
+
|
|
614
618
|
- 🧪 CI/CD 中需要可重复的测试数据
|
|
615
619
|
- 📋 团队间共享一致的测试环境
|
|
616
620
|
- 🔄 开发时快速重建数据库状态
|
|
617
621
|
|
|
618
|
-
|
|
622
|
+
***
|
|
619
623
|
|
|
620
624
|
### 教程 8:AI 智能配置(sqlseed-ai 插件)
|
|
621
625
|
|
|
@@ -655,7 +659,7 @@ sqlseed ai-suggest app.db --table bank_cards --output bank_cards.yaml --no-cache
|
|
|
655
659
|
|
|
656
660
|
> **💡 环境变量**:支持 `SQLSEED_AI_API_KEY`、`SQLSEED_AI_BASE_URL`、`SQLSEED_AI_MODEL`。默认模型为 `qwen3-coder-plus`。
|
|
657
661
|
|
|
658
|
-
|
|
662
|
+
***
|
|
659
663
|
|
|
660
664
|
### 教程 9:MCP 服务器集成
|
|
661
665
|
|
|
@@ -671,12 +675,12 @@ python -m mcp_server_sqlseed
|
|
|
671
675
|
|
|
672
676
|
**MCP 提供的能力**:
|
|
673
677
|
|
|
674
|
-
| 类型
|
|
675
|
-
|
|
676
|
-
| 📖 Resource | `sqlseed://schema/{db_path}/{table_name}` | 获取表 Schema 的 JSON 表示
|
|
677
|
-
| 🔍 Tool
|
|
678
|
-
| 🤖 Tool
|
|
679
|
-
| ⚡ Tool
|
|
678
|
+
| 类型 | 名称 | 说明 |
|
|
679
|
+
| :---------- | :---------------------------------------- | :----------------------------------- |
|
|
680
|
+
| 📖 Resource | `sqlseed://schema/{db_path}/{table_name}` | 获取表 Schema 的 JSON 表示 |
|
|
681
|
+
| 🔍 Tool | `sqlseed_inspect_schema` | 检查 Schema(列、外键、索引、样本数据、schema\_hash) |
|
|
682
|
+
| 🤖 Tool | `sqlseed_generate_yaml` | AI 驱动的 YAML 配置生成(含自纠正) |
|
|
683
|
+
| ⚡ Tool | `sqlseed_execute_fill` | 执行数据生成(支持 YAML 配置字符串) |
|
|
680
684
|
|
|
681
685
|
这意味着你可以在 AI 助手中说:
|
|
682
686
|
|
|
@@ -684,7 +688,7 @@ python -m mcp_server_sqlseed
|
|
|
684
688
|
|
|
685
689
|
AI 助手会依次调用 `inspect_schema` → `generate_yaml` → `execute_fill`,无需你手动编写任何代码。
|
|
686
690
|
|
|
687
|
-
|
|
691
|
+
***
|
|
688
692
|
|
|
689
693
|
### 教程 10:自定义 Provider 插件
|
|
690
694
|
|
|
@@ -718,7 +722,7 @@ class MyCustomProvider:
|
|
|
718
722
|
# 完整 Protocol 参见:src/sqlseed/generators/_protocol.py
|
|
719
723
|
```
|
|
720
724
|
|
|
721
|
-
**注册方式 1
|
|
725
|
+
**注册方式 1:通过** **`pyproject.toml`** **entry-point(推荐)**
|
|
722
726
|
|
|
723
727
|
```toml
|
|
724
728
|
[project.entry-points."sqlseed"]
|
|
@@ -737,7 +741,7 @@ class MyPlugin:
|
|
|
737
741
|
registry.register(MyCustomProvider())
|
|
738
742
|
```
|
|
739
743
|
|
|
740
|
-
|
|
744
|
+
***
|
|
741
745
|
|
|
742
746
|
## 🖥️ CLI 命令速查
|
|
743
747
|
|
|
@@ -796,7 +800,7 @@ sqlseed ai-suggest app.db -t users -o users.yaml
|
|
|
796
800
|
sqlseed ai-suggest app.db -t users -o users.yaml --model gpt-4o --verify
|
|
797
801
|
```
|
|
798
802
|
|
|
799
|
-
|
|
803
|
+
***
|
|
800
804
|
|
|
801
805
|
## 🧠 8 级智能列映射
|
|
802
806
|
|
|
@@ -827,27 +831,27 @@ Level 8 │ 默认 string (min=5, max=50)
|
|
|
827
831
|
- 列类型 `VARCHAR(20)` → Level 7 类型回退 → 最长 20 字符的字符串 ✅
|
|
828
832
|
- 列有 `DEFAULT 1` → Level 6 → 跳过生成 ✅
|
|
829
833
|
|
|
830
|
-
|
|
834
|
+
***
|
|
831
835
|
|
|
832
836
|
## 🧩 插件系统
|
|
833
837
|
|
|
834
838
|
sqlseed 通过 [pluggy](https://pluggy.readthedocs.io/) 提供 11 个 Hook 点,覆盖数据生成全生命周期:
|
|
835
839
|
|
|
836
|
-
| Hook
|
|
837
|
-
|
|
838
|
-
| `sqlseed_register_providers`
|
|
839
|
-
| `sqlseed_register_column_mappers` | | 注册自定义列映射规则
|
|
840
|
-
| `sqlseed_ai_analyze_table`
|
|
841
|
-
| `sqlseed_pre_generate_templates`
|
|
842
|
-
| `sqlseed_before_generate`
|
|
843
|
-
| `sqlseed_after_generate`
|
|
844
|
-
| `sqlseed_transform_row`
|
|
845
|
-
| `sqlseed_transform_batch`
|
|
846
|
-
| `sqlseed_before_insert`
|
|
847
|
-
| `sqlseed_after_insert`
|
|
848
|
-
| `sqlseed_shared_pool_loaded`
|
|
849
|
-
|
|
850
|
-
|
|
840
|
+
| Hook | firstresult | 触发时机 |
|
|
841
|
+
| :-------------------------------- | :---------: | :--------------------- |
|
|
842
|
+
| `sqlseed_register_providers` | <br /> | 注册自定义数据 Provider |
|
|
843
|
+
| `sqlseed_register_column_mappers` | <br /> | 注册自定义列映射规则 |
|
|
844
|
+
| `sqlseed_ai_analyze_table` | ✓ | AI 分析表 Schema(返回列配置建议) |
|
|
845
|
+
| `sqlseed_pre_generate_templates` | ✓ | AI 预计算候选值池 |
|
|
846
|
+
| `sqlseed_before_generate` | <br /> | 数据生成循环前 |
|
|
847
|
+
| `sqlseed_after_generate` | <br /> | 数据生成完成后 |
|
|
848
|
+
| `sqlseed_transform_row` | <br /> | 逐行变换(热路径,注意性能) |
|
|
849
|
+
| `sqlseed_transform_batch` | <br /> | 逐批变换(支持链式处理) |
|
|
850
|
+
| `sqlseed_before_insert` | <br /> | 每批写入 DB 前 |
|
|
851
|
+
| `sqlseed_after_insert` | <br /> | 每批写入 DB 后 |
|
|
852
|
+
| `sqlseed_shared_pool_loaded` | <br /> | 跨表共享池加载完成 |
|
|
853
|
+
|
|
854
|
+
***
|
|
851
855
|
|
|
852
856
|
## 🏗️ 项目架构
|
|
853
857
|
|
|
@@ -899,7 +903,7 @@ plugins/
|
|
|
899
903
|
└── src/mcp_server_sqlseed/ # FastMCP 工具 (inspect/generate_yaml/execute_fill)
|
|
900
904
|
```
|
|
901
905
|
|
|
902
|
-
|
|
906
|
+
***
|
|
903
907
|
|
|
904
908
|
## 🛠️ 开发
|
|
905
909
|
|
|
@@ -919,13 +923,13 @@ mypy src/sqlseed/
|
|
|
919
923
|
|
|
920
924
|
测试覆盖了所有核心模块,路径结构与 `src/` 一一对应:`test_core/`、`test_database/`、`test_generators/`、`test_plugins/`、`test_config/`、`test_utils/`。
|
|
921
925
|
|
|
922
|
-
|
|
926
|
+
***
|
|
923
927
|
|
|
924
928
|
## 📄 License
|
|
925
929
|
|
|
926
930
|
[AGPL-3.0-or-later](LICENSE)
|
|
927
931
|
|
|
928
|
-
|
|
932
|
+
***
|
|
929
933
|
|
|
930
934
|
<div align="center">
|
|
931
935
|
|