Skip to content

fix(generator): 方言类型 import 修正 + jsonb 统一为 JSONType(关闭 #542 核心路径) - #547

Merged
fastapiadmin merged 1 commit into
masterfrom
dev
Oct 22, 2026
Merged

fastapiadmin merged 1 commit into
masterfrom
dev

Conversation

@fastapiadmin

Copy link
Copy Markdown
Owner

修复 issue #542 的核心故障路径(此前 #545 只提供了基类 JSONType,生成器仍会产出非法 import)。

问题

  • GenConstant.DB_TO_SQLALCHEMY['jsonb'] = 'JSONB',生成器拼 import 时得到
    from sqlalchemy import JSONB —— JSONB 不在顶层 sqlalchemy 命名空间,实测 AttributeError,
    生成的模型在 import 阶段即失败(比 issue 描述的 SQLite CompileError 更早)。
  • 同一逻辑影响 INET / CIDR / MACADDR / Bit / TSVECTOR / TSQUERY(均非顶层导出);
    Geometry 会先加 geoalchemy2 再被覆盖成非法的 from sqlalchemy import Geometry。

改动

  1. PG 分支映射:jsonb → JSONType(跨方言)、bit / bit varying → BIT
  2. 新增 DIALECT_TYPE_IMPORTS(template_safety.py):按类型名给出正确的 (模块, 类名)
  3. 生成器 import 拼装改用该表,不再产生顶层方言类型 import

验证

  • 新增 5 个回归测试(含 PG 方言子进程 + 端到端渲染 ast.parse)
  • 红绿验证:还原源码后 4 个新测试失败(报错即 from sqlalchemy import JSONB);修复后 5 passed
  • 全量 pytest:102 passed;ruff 通过;basedpyright 0 errors

issue #542 的核心路径修复(此前只提供了基类 JSONType,生成器仍会产出非法 import):

- GenConstant.DB_TO_SQLALCHEMY(PG 分支):jsonb → JSONType;bit / bit varying → BIT
- template_safety 新增 DIALECT_TYPE_IMPORTS:JSONType → app.core.base_model;
  INET / CIDR / MACADDR / BIT / TSVECTOR / TSQUERY → sqlalchemy.dialects.postgresql;
  Geometry → geoalchemy2
- 生成器拼 import 时按该表取模块,杜绝 `from sqlalchemy import JSONB` 这类非法语句
  (这些类型不在顶层 sqlalchemy 命名空间,实测 AttributeError;生成的模型在 import 阶段就失败)

回归测试(backend/tests/test_generator_template_safety.py,新增 5 个):
- DIALECT_TYPE_IMPORTS 的目标模块/类名均可解析(geoalchemy2 为可选依赖,跳过)
- PG 方言下 8 种方言类型的 import 均正确、且不出现顶层 import
- PG 方言下 jsonb 列渲染 JSONType、bit 渲染 BIT
- 端到端渲染出的模型可 ast.parse,且从基类导入 JSONType
- JSONType 在 PG 渲染 JSONB、SQLite/MySQL 渲染 JSON

红绿验证:临时还原三处源码后 4 个新测试失败(报错正是 from sqlalchemy import JSONB);
修复后 5 passed;全量 102 passed;ruff All checks passed;basedpyright 0 errors。
@fastapiadmin
fastapiadmin merged commit c0d6e4e into master Oct 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant