数据库迁移

This commit is contained in:
2025-11-19 14:28:00 +08:00
parent d66323487b
commit 6a287b5f9d
6 changed files with 161 additions and 32 deletions

View File

@@ -1,20 +1,19 @@
-- 000003_add_owner_id_shop_id.down.sql
-- 示例迁移:回滚 owner_id 和 shop_id 字段
-- 注:此为模板迁移,实际业务表由项目需求决定
-- 重要说明user/order 模块已移除,本模板仅供新的业务表参照。
-- 示例:回滚订单表的数据权限字段
-- DROP INDEX IF EXISTS idx_orders_owner_shop;
-- DROP INDEX IF EXISTS idx_orders_shop_id;
-- DROP INDEX IF EXISTS idx_orders_owner_id;
-- ALTER TABLE tb_orders DROP COLUMN IF EXISTS shop_id;
-- ALTER TABLE tb_orders DROP COLUMN IF EXISTS owner_id;
-- 示例:回滚 SIM 卡表的数据权限字段
-- DROP INDEX IF EXISTS idx_sim_card_owner_shop;
-- DROP INDEX IF EXISTS idx_sim_card_shop_id;
-- DROP INDEX IF EXISTS idx_sim_card_owner_id;
-- ALTER TABLE tb_sim_card DROP COLUMN IF EXISTS shop_id;
-- ALTER TABLE tb_sim_card DROP COLUMN IF EXISTS owner_id;
-- 示例:回滚商品表的数据权限字段
-- DROP INDEX IF EXISTS idx_products_owner_shop;
-- DROP INDEX IF EXISTS idx_products_shop_id;
-- DROP INDEX IF EXISTS idx_products_owner_id;
-- ALTER TABLE tb_products DROP COLUMN IF EXISTS shop_id;
-- ALTER TABLE tb_products DROP COLUMN IF EXISTS owner_id;
-- 示例:回滚设备表的数据权限字段
-- DROP INDEX IF EXISTS idx_device_owner_shop;
-- DROP INDEX IF EXISTS idx_device_shop_id;
-- DROP INDEX IF EXISTS idx_device_owner_id;
-- ALTER TABLE tb_device DROP COLUMN IF EXISTS shop_id;
-- ALTER TABLE tb_device DROP COLUMN IF EXISTS owner_id;
-- 占位语句(避免空迁移文件报错)
SELECT 1;

View File

@@ -1,27 +1,28 @@
-- 000003_add_owner_id_shop_id.up.sql
-- 示例迁移:为业务表添加 owner_id 和 shop_id 字段
-- 注:此为模板迁移,实际业务表由项目需求决定
-- 重要说明user/order 模块已移除,本模板仅供新的业务表(例如 SIM、设备、套餐等参照。
-- 使用方法:
-- 1. 复制此模板
-- 2. 修改表名为实际业务表
-- 3. 根据业务需求调整字段类型和约束
-- 2. 替换示例表名为真实表名
-- 3. 按需调整字段类型、索引、默认值
-- 示例:为订单表添加数据权限字段
-- ALTER TABLE tb_orders ADD COLUMN owner_id BIGINT;
-- ALTER TABLE tb_orders ADD COLUMN shop_id BIGINT;
-- 示例:为 SIM 卡表添加数据权限字段
-- ALTER TABLE tb_sim_card ADD COLUMN owner_id BIGINT;
-- ALTER TABLE tb_sim_card ADD COLUMN shop_id BIGINT;
--
-- -- 创建索引以支持数据权限过滤
-- CREATE INDEX idx_orders_owner_id ON tb_orders(owner_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_orders_shop_id ON tb_orders(shop_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_orders_owner_shop ON tb_orders(owner_id, shop_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_sim_card_owner_id ON tb_sim_card(owner_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_sim_card_shop_id ON tb_sim_card(shop_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_sim_card_owner_shop ON tb_sim_card(owner_id, shop_id) WHERE deleted_at IS NULL;
-- 示例:为商品表添加数据权限字段
-- ALTER TABLE tb_products ADD COLUMN owner_id BIGINT;
-- ALTER TABLE tb_products ADD COLUMN shop_id BIGINT;
-- 示例:为设备表添加数据权限字段
-- ALTER TABLE tb_device ADD COLUMN owner_id BIGINT;
-- ALTER TABLE tb_device ADD COLUMN shop_id BIGINT;
--
-- CREATE INDEX idx_products_owner_id ON tb_products(owner_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_products_shop_id ON tb_products(shop_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_products_owner_shop ON tb_products(owner_id, shop_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_device_owner_id ON tb_device(owner_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_device_shop_id ON tb_device(shop_id) WHERE deleted_at IS NULL;
-- CREATE INDEX idx_device_owner_shop ON tb_device(owner_id, shop_id) WHERE deleted_at IS NULL;
-- 批量表处理建议:可将多个 ALTER 语句放入同一次迁移,以保持版本一致。
-- 通用数据权限字段规范:
-- owner_id: 数据所有者账号 ID关联 tb_account.id

View File

@@ -0,0 +1,83 @@
-- 000004_drop_legacy_user_order.down.sql
-- 说明:回滚时恢复 legacy 用户/订单表(与历史 000001_init_schema 一致)。
BEGIN;
-- 恢复用户表
CREATE TABLE IF NOT EXISTS tb_user (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP,
-- 基本信息
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
-- 状态字段
status VARCHAR(20) NOT NULL DEFAULT 'active',
-- 元数据
last_login_at TIMESTAMP,
-- 唯一约束
CONSTRAINT uk_user_username UNIQUE (username),
CONSTRAINT uk_user_email UNIQUE (email)
);
-- 恢复订单表
CREATE TABLE IF NOT EXISTS tb_order (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP,
-- 业务唯一键
order_id VARCHAR(50) NOT NULL,
-- 关联关系(注意:无数据库外键约束,在代码中管理)
user_id INTEGER NOT NULL,
-- 订单信息
amount BIGINT NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'pending',
remark VARCHAR(500),
-- 时间字段
paid_at TIMESTAMP,
completed_at TIMESTAMP,
-- 唯一约束
CONSTRAINT uk_order_order_id UNIQUE (order_id)
);
-- 索引恢复
CREATE INDEX IF NOT EXISTS idx_user_deleted_at ON tb_user(deleted_at);
CREATE INDEX IF NOT EXISTS idx_user_status ON tb_user(status);
CREATE INDEX IF NOT EXISTS idx_user_created_at ON tb_user(created_at);
CREATE INDEX IF NOT EXISTS idx_order_deleted_at ON tb_order(deleted_at);
CREATE INDEX IF NOT EXISTS idx_order_user_id ON tb_order(user_id);
CREATE INDEX IF NOT EXISTS idx_order_status ON tb_order(status);
CREATE INDEX IF NOT EXISTS idx_order_created_at ON tb_order(created_at);
-- 注释恢复
COMMENT ON TABLE tb_user IS '用户表';
COMMENT ON COLUMN tb_user.username IS '用户名(唯一)';
COMMENT ON COLUMN tb_user.email IS '邮箱(唯一)';
COMMENT ON COLUMN tb_user.password IS '密码bcrypt 哈希)';
COMMENT ON COLUMN tb_user.status IS '用户状态active, inactive, suspended';
COMMENT ON COLUMN tb_user.deleted_at IS '软删除时间';
COMMENT ON TABLE tb_order IS '订单表';
COMMENT ON COLUMN tb_order.order_id IS '订单号(业务唯一键)';
COMMENT ON COLUMN tb_order.user_id IS '用户 ID在代码中维护关联无数据库外键';
COMMENT ON COLUMN tb_order.amount IS '金额(分)';
COMMENT ON COLUMN tb_order.status IS '订单状态pending, paid, processing, completed, cancelled';
COMMENT ON COLUMN tb_order.deleted_at IS '软删除时间';
COMMIT;
-- 占位,避免空事务报错
SELECT 1;

View File

@@ -0,0 +1,13 @@
-- 000004_drop_legacy_user_order.up.sql
-- 说明:清理已废弃的 legacy 用户/订单表,保证数据库结构与现有代码一致。
BEGIN;
-- 先删除依赖度更高的订单表,再删除用户表
DROP TABLE IF EXISTS tb_order;
DROP TABLE IF EXISTS tb_user;
COMMIT;
-- 占位,避免空事务报错
SELECT 1;