- 3 CRUD JSON files: customer_balance, accounting_records, sync_state - Build script with model validation, CRUD validation, DDL generation - DDL: db/schema.sql (72 lines, 7 tables) - Scripts: validate_models.py, validate_crud.py, generate_ddl.py
153 lines
7.6 KiB
SQL
153 lines
7.6 KiB
SQL
-- SageAPI DDL (auto-generated)
|
||
|
||
CREATE TABLE IF NOT EXISTS `accounting_records` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键',
|
||
`customer_id` VARCHAR(32) NOT NULL DEFAULT COMMENT '客户ID',
|
||
`llmid` VARCHAR(32) NULL DEFAULT COMMENT '模型ID',
|
||
`model_name` VARCHAR(128) NULL DEFAULT COMMENT '模型名称',
|
||
`pricing_id` VARCHAR(32) NULL DEFAULT COMMENT '定价ID',
|
||
`input_tokens` BIGINT NULL COMMENT '输入token数',
|
||
`output_tokens` BIGINT NULL COMMENT '输出token数',
|
||
`total_tokens` BIGINT NULL COMMENT '总token数',
|
||
`quantity` DECIMAL(15,4) NULL COMMENT '用量(图片数/分钟数等)',
|
||
`amount` DECIMAL(15,6) NOT NULL DEFAULT 0.0 COMMENT '金额',
|
||
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位',
|
||
`request_id` VARCHAR(64) NULL DEFAULT COMMENT '请求ID(幂等键)',
|
||
`transno` VARCHAR(64) NULL DEFAULT COMMENT '事务号',
|
||
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '状态: pending/accounted/failed',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `accounting_records` ADD INDEX `idx_customer_id` (`customer_id`);
|
||
|
||
ALTER TABLE `accounting_records` ADD INDEX `idx_llmid` (`llmid`);
|
||
|
||
ALTER TABLE `accounting_records` ADD UNIQUE `idx_request_id` (`request_id`);
|
||
|
||
ALTER TABLE `accounting_records` ADD INDEX `idx_status` (`status`);
|
||
|
||
ALTER TABLE `accounting_records` ADD INDEX `idx_created_at` (`created_at`);
|
||
|
||
CREATE TABLE IF NOT EXISTS `customer_balance` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键,即 customer_id',
|
||
`balance` DECIMAL(15,4) NOT NULL DEFAULT 0.0 COMMENT '当前余额',
|
||
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位',
|
||
`credit_limit` DECIMAL(15,4) NULL COMMENT '信用额度',
|
||
`last_recharge` DATETIME NULL COMMENT '最后充值时间',
|
||
`last_consumption` DATETIME NULL COMMENT '最后消费时间',
|
||
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/suspended/arrears',
|
||
`sync_version` VARCHAR(32) NULL DEFAULT COMMENT '同步版本号',
|
||
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存更新时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `customer_balance` ADD INDEX `idx_status` (`status`);
|
||
|
||
ALTER TABLE `customer_balance` ADD INDEX `idx_balance` (`balance`);
|
||
|
||
CREATE TABLE IF NOT EXISTS `llmage_cache` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键',
|
||
`llmid` VARCHAR(32) NOT NULL DEFAULT COMMENT '关联模型ID',
|
||
`model_name` VARCHAR(128) NULL DEFAULT COMMENT '模型名称',
|
||
`upappid` VARCHAR(32) NOT NULL DEFAULT COMMENT '上游应用ID',
|
||
`apiname` VARCHAR(128) NOT NULL DEFAULT COMMENT 'API名称',
|
||
`api_url` VARCHAR(512) NULL DEFAULT COMMENT 'API端点URL',
|
||
`api_params` TEXT NULL COMMENT 'API参数配置JSON',
|
||
`model_params` TEXT NULL COMMENT '模型参数配置JSON(max_tokens, temperature等)',
|
||
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive',
|
||
`sync_version` VARCHAR(32) NULL DEFAULT COMMENT '同步版本号',
|
||
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `llmage_cache` ADD INDEX `idx_llmid` (`llmid`);
|
||
|
||
ALTER TABLE `llmage_cache` ADD INDEX `idx_upappid` (`upappid`);
|
||
|
||
ALTER TABLE `llmage_cache` ADD INDEX `idx_apiname` (`apiname`);
|
||
|
||
CREATE TABLE IF NOT EXISTS `pricing_cache` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键,对应 pricing_program id (ppid)',
|
||
`llmid` VARCHAR(32) NOT NULL DEFAULT COMMENT '关联模型ID',
|
||
`model_name` VARCHAR(128) NULL DEFAULT COMMENT '模型名称',
|
||
`pricing_type` VARCHAR(32) NOT NULL DEFAULT COMMENT '计费类型: token/image/video/audio',
|
||
`input_price` DECIMAL(10,6) NULL COMMENT '输入单价(每千token)',
|
||
`output_price` DECIMAL(10,6) NULL COMMENT '输出单价(每千token)',
|
||
`unit_price` DECIMAL(10,6) NULL COMMENT '统一单价(按次/按图/按分钟等)',
|
||
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位',
|
||
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive/deprecated',
|
||
`effective_from` DATETIME NULL COMMENT '生效时间',
|
||
`effective_to` DATETIME NULL COMMENT '失效时间',
|
||
`sync_version` VARCHAR(32) NULL DEFAULT COMMENT '同步版本号',
|
||
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `pricing_cache` ADD INDEX `idx_llmid` (`llmid`);
|
||
|
||
ALTER TABLE `pricing_cache` ADD INDEX `idx_pricing_type` (`pricing_type`);
|
||
|
||
ALTER TABLE `pricing_cache` ADD INDEX `idx_status` (`status`);
|
||
|
||
CREATE TABLE IF NOT EXISTS `sync_state` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键',
|
||
`entity_type` VARCHAR(32) NOT NULL DEFAULT COMMENT '实体类型: users/pricing/llmage/uapi',
|
||
`entity_id` VARCHAR(64) NULL DEFAULT COMMENT '实体标识(全量同步时为空)',
|
||
`last_sync_time` DATETIME NULL COMMENT '最后同步时间',
|
||
`sync_version` VARCHAR(32) NULL DEFAULT COMMENT 'Sage返回的版本标识',
|
||
`sync_status` VARCHAR(16) NOT NULL DEFAULT 'success' COMMENT '同步状态: success/pending/failed',
|
||
`error_msg` TEXT NULL COMMENT '失败原因',
|
||
`retry_count` INT NOT NULL DEFAULT 0 COMMENT '重试次数',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `sync_state` ADD INDEX `idx_entity_type` (`entity_type`);
|
||
|
||
ALTER TABLE `sync_state` ADD UNIQUE `idx_entity_type_id` (`entity_type`,`entity_id`);
|
||
|
||
ALTER TABLE `sync_state` ADD INDEX `idx_sync_status` (`sync_status`);
|
||
|
||
CREATE TABLE IF NOT EXISTS `uapi_cache` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键',
|
||
`upappid` VARCHAR(32) NOT NULL DEFAULT COMMENT '上游应用ID',
|
||
`apiname` VARCHAR(128) NOT NULL DEFAULT COMMENT 'API名称',
|
||
`method` VARCHAR(16) NULL DEFAULT 'POST' COMMENT 'HTTP方法',
|
||
`endpoint` VARCHAR(512) NULL DEFAULT COMMENT 'API端点',
|
||
`auth_type` VARCHAR(32) NULL DEFAULT 'bearer' COMMENT '认证类型',
|
||
`rate_limit` INT NULL COMMENT '速率限制(次/分钟)',
|
||
`description` TEXT NULL COMMENT 'API描述',
|
||
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态',
|
||
`sync_version` VARCHAR(32) NULL DEFAULT COMMENT '同步版本号',
|
||
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `uapi_cache` ADD UNIQUE `idx_upappid_apiname` (`upappid`,`apiname`);
|
||
|
||
ALTER TABLE `uapi_cache` ADD INDEX `idx_status` (`status`);
|
||
|
||
CREATE TABLE IF NOT EXISTS `users_cache` (
|
||
`id` VARCHAR(32) NOT NULL DEFAULT COMMENT '主键,对应 users 表 id',
|
||
`username` VARCHAR(128) NOT NULL DEFAULT COMMENT '用户名',
|
||
`orgid` VARCHAR(32) NULL DEFAULT COMMENT '组织ID',
|
||
`orgname` VARCHAR(255) NULL DEFAULT COMMENT '组织名称',
|
||
`email` VARCHAR(128) NULL DEFAULT COMMENT '邮箱',
|
||
`phone` VARCHAR(32) NULL DEFAULT COMMENT '手机号',
|
||
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive/suspended',
|
||
`created_at` DATETIME NULL COMMENT '创建时间',
|
||
`updated_at` DATETIME NULL COMMENT '更新时间',
|
||
`sync_version` VARCHAR(32) NULL DEFAULT COMMENT '同步版本号',
|
||
`cached_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存写入时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
ALTER TABLE `users_cache` ADD INDEX `idx_username` (`username`);
|
||
|
||
ALTER TABLE `users_cache` ADD INDEX `idx_orgid` (`orgid`);
|
||
|
||
ALTER TABLE `users_cache` ADD INDEX `idx_sync_version` (`sync_version`);
|