From d01e245a2ca52b5dd9be722d52a7290e98a4ccf6 Mon Sep 17 00:00:00 2001 From: weijuesen Date: Thu, 13 Aug 2026 23:42:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9F=BA=E7=BA=BF=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=B9=82=E7=AD=89=E4=BB=A5=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=B7=B2=E6=9C=89=E5=BC=80=E5=8F=91=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server-go/migrations/000001_baseline.up.sql | 121 ++++++++++---------- 开发交接记录.md | 1 + 2 files changed, 62 insertions(+), 60 deletions(-) diff --git a/server-go/migrations/000001_baseline.up.sql b/server-go/migrations/000001_baseline.up.sql index bab73c0..fe2af8d 100644 --- a/server-go/migrations/000001_baseline.up.sql +++ b/server-go/migrations/000001_baseline.up.sql @@ -1,4 +1,4 @@ -CREATE TABLE users ( +CREATE TABLE IF NOT EXISTS users ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), username text NOT NULL UNIQUE, email text NOT NULL UNIQUE, @@ -10,7 +10,7 @@ CREATE TABLE users ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE TABLE rooms ( +CREATE TABLE IF NOT EXISTS rooms ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL, code text, @@ -24,7 +24,7 @@ CREATE TABLE rooms ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE TABLE devices ( +CREATE TABLE IF NOT EXISTS devices ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), device_key text NOT NULL UNIQUE, name text NOT NULL, @@ -39,9 +39,9 @@ CREATE TABLE devices ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_devices_room_id ON devices (room_id); +CREATE INDEX IF NOT EXISTS idx_devices_room_id ON devices (room_id); -CREATE TABLE sensors ( +CREATE TABLE IF NOT EXISTS sensors ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL, metric text NOT NULL, @@ -51,9 +51,9 @@ CREATE TABLE sensors ( created_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_sensors_device_id ON sensors (device_id); +CREATE INDEX IF NOT EXISTS idx_sensors_device_id ON sensors (device_id); -CREATE TABLE thresholds ( +CREATE TABLE IF NOT EXISTS thresholds ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text, min_value double precision NOT NULL, @@ -66,9 +66,9 @@ CREATE TABLE thresholds ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_thresholds_sensor_id ON thresholds (sensor_id); +CREATE INDEX IF NOT EXISTS idx_thresholds_sensor_id ON thresholds (sensor_id); -CREATE TABLE alarms ( +CREATE TABLE IF NOT EXISTS alarms ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), code text, title text, @@ -86,9 +86,9 @@ CREATE TABLE alarms ( threshold_max double precision ); -CREATE INDEX idx_alarms_device_open_triggered ON alarms (device_key, open, triggered_at); +CREATE INDEX IF NOT EXISTS idx_alarms_device_open_triggered ON alarms (device_key, open, triggered_at); -CREATE TABLE cameras ( +CREATE TABLE IF NOT EXISTS cameras ( id bigserial PRIMARY KEY, room_id text, code varchar(64) NOT NULL, @@ -116,9 +116,9 @@ CREATE TABLE cameras ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_cameras_room_id ON cameras (room_id); +CREATE INDEX IF NOT EXISTS idx_cameras_room_id ON cameras (room_id); -CREATE TABLE video_clips ( +CREATE TABLE IF NOT EXISTS video_clips ( id bigserial PRIMARY KEY, trigger text NOT NULL DEFAULT 'alarm', file_path text, @@ -137,11 +137,11 @@ CREATE TABLE video_clips ( s3_key text ); -CREATE INDEX idx_video_clips_alarm_id ON video_clips (alarm_id); -CREATE INDEX idx_video_clips_room_id ON video_clips (room_id); -CREATE INDEX idx_video_clips_camera_id ON video_clips (camera_id); +CREATE INDEX IF NOT EXISTS idx_video_clips_alarm_id ON video_clips (alarm_id); +CREATE INDEX IF NOT EXISTS idx_video_clips_room_id ON video_clips (room_id); +CREATE INDEX IF NOT EXISTS idx_video_clips_camera_id ON video_clips (camera_id); -CREATE TABLE audit_logs ( +CREATE TABLE IF NOT EXISTS audit_logs ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid, username text, @@ -155,11 +155,11 @@ CREATE TABLE audit_logs ( created_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_audit_logs_resource_target ON audit_logs (resource, target_id); -CREATE INDEX idx_audit_logs_action_created ON audit_logs (action, created_at); -CREATE INDEX idx_audit_logs_user_created ON audit_logs (user_id, created_at); +CREATE INDEX IF NOT EXISTS idx_audit_logs_resource_target ON audit_logs (resource, target_id); +CREATE INDEX IF NOT EXISTS idx_audit_logs_action_created ON audit_logs (action, created_at); +CREATE INDEX IF NOT EXISTS idx_audit_logs_user_created ON audit_logs (user_id, created_at); -CREATE TABLE telemetry ( +CREATE TABLE IF NOT EXISTS telemetry ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), device_key text NOT NULL, metric text NOT NULL, @@ -167,9 +167,9 @@ CREATE TABLE telemetry ( timestamp timestamptz NOT NULL ); -CREATE INDEX idx_telemetry_device_timestamp ON telemetry (device_key, timestamp); +CREATE INDEX IF NOT EXISTS idx_telemetry_device_timestamp ON telemetry (device_key, timestamp); -CREATE TABLE permissions ( +CREATE TABLE IF NOT EXISTS permissions ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), code text NOT NULL, name text NOT NULL, @@ -177,18 +177,18 @@ CREATE TABLE permissions ( created_at timestamptz NOT NULL DEFAULT now() ); -CREATE UNIQUE INDEX idx_permissions_code ON permissions (code); +CREATE UNIQUE INDEX IF NOT EXISTS idx_permissions_code ON permissions (code); -CREATE TABLE role_permissions ( +CREATE TABLE IF NOT EXISTS role_permissions ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), role text NOT NULL, permission_id uuid NOT NULL, created_at timestamptz NOT NULL DEFAULT now() ); -CREATE UNIQUE INDEX idx_role_permissions_role_code ON role_permissions (role, permission_id); +CREATE UNIQUE INDEX IF NOT EXISTS idx_role_permissions_role_code ON role_permissions (role, permission_id); -CREATE TABLE diseases ( +CREATE TABLE IF NOT EXISTS diseases ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name varchar(64) NOT NULL, category varchar(32) NOT NULL, @@ -211,9 +211,9 @@ CREATE TABLE diseases ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_diseases_category ON diseases (category); +CREATE INDEX IF NOT EXISTS idx_diseases_category ON diseases (category); -CREATE TABLE knowledge_articles ( +CREATE TABLE IF NOT EXISTS knowledge_articles ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), kind varchar(32) NOT NULL, title varchar(128) NOT NULL, @@ -225,9 +225,9 @@ CREATE TABLE knowledge_articles ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_knowledge_articles_kind ON knowledge_articles (kind); +CREATE INDEX IF NOT EXISTS idx_knowledge_articles_kind ON knowledge_articles (kind); -CREATE TABLE inspection_records ( +CREATE TABLE IF NOT EXISTS inspection_records ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid, room_id uuid, @@ -241,11 +241,11 @@ CREATE TABLE inspection_records ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE UNIQUE INDEX idx_inspection_records_idempotency_key ON inspection_records (idempotency_key); -CREATE INDEX idx_inspection_records_room_id ON inspection_records (room_id); -CREATE INDEX idx_inspection_records_user_id ON inspection_records (user_id); +CREATE UNIQUE INDEX IF NOT EXISTS idx_inspection_records_idempotency_key ON inspection_records (idempotency_key); +CREATE INDEX IF NOT EXISTS idx_inspection_records_room_id ON inspection_records (room_id); +CREATE INDEX IF NOT EXISTS idx_inspection_records_user_id ON inspection_records (user_id); -CREATE TABLE trays ( +CREATE TABLE IF NOT EXISTS trays ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name varchar(64) NOT NULL, code varchar(64), @@ -256,9 +256,9 @@ CREATE TABLE trays ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_trays_room_id ON trays (room_id); +CREATE INDEX IF NOT EXISTS idx_trays_room_id ON trays (room_id); -CREATE TABLE batches ( +CREATE TABLE IF NOT EXISTS batches ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), room_id uuid NOT NULL, name varchar(64) NOT NULL, @@ -275,9 +275,9 @@ CREATE TABLE batches ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_batches_room_id ON batches (room_id); +CREATE INDEX IF NOT EXISTS idx_batches_room_id ON batches (room_id); -CREATE TABLE rearing_records ( +CREATE TABLE IF NOT EXISTS rearing_records ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), batch_id uuid NOT NULL, record_date timestamptz NOT NULL, @@ -289,9 +289,9 @@ CREATE TABLE rearing_records ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_rearing_records_batch_id ON rearing_records (batch_id); +CREATE INDEX IF NOT EXISTS idx_rearing_records_batch_id ON rearing_records (batch_id); -CREATE TABLE wechat_bindings ( +CREATE TABLE IF NOT EXISTS wechat_bindings ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid NOT NULL, open_id varchar(128) NOT NULL, @@ -300,10 +300,10 @@ CREATE TABLE wechat_bindings ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE UNIQUE INDEX idx_wechat_bindings_open_id ON wechat_bindings (open_id); -CREATE UNIQUE INDEX idx_wechat_bindings_user_id ON wechat_bindings (user_id); +CREATE UNIQUE INDEX IF NOT EXISTS idx_wechat_bindings_open_id ON wechat_bindings (open_id); +CREATE UNIQUE INDEX IF NOT EXISTS idx_wechat_bindings_user_id ON wechat_bindings (user_id); -CREATE TABLE weather_alerts ( +CREATE TABLE IF NOT EXISTS weather_alerts ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), disease varchar(64) NOT NULL, level varchar(16) NOT NULL, @@ -312,7 +312,7 @@ CREATE TABLE weather_alerts ( created_at timestamptz NOT NULL DEFAULT now() ); -CREATE TABLE lamp_tests ( +CREATE TABLE IF NOT EXISTS lamp_tests ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), method varchar(32) NOT NULL DEFAULT 'lamp', room_id uuid, @@ -332,10 +332,10 @@ CREATE TABLE lamp_tests ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_lamp_tests_batch_id ON lamp_tests (batch_id); -CREATE INDEX idx_lamp_tests_room_id ON lamp_tests (room_id); +CREATE INDEX IF NOT EXISTS idx_lamp_tests_batch_id ON lamp_tests (batch_id); +CREATE INDEX IF NOT EXISTS idx_lamp_tests_room_id ON lamp_tests (room_id); -CREATE TABLE lamp_test_steps ( +CREATE TABLE IF NOT EXISTS lamp_test_steps ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), lamp_test_id uuid NOT NULL, step_no bigint NOT NULL, @@ -347,9 +347,9 @@ CREATE TABLE lamp_test_steps ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_lamp_test_steps_lamp_test_id ON lamp_test_steps (lamp_test_id); +CREATE INDEX IF NOT EXISTS idx_lamp_test_steps_lamp_test_id ON lamp_test_steps (lamp_test_id); -CREATE TABLE consumables ( +CREATE TABLE IF NOT EXISTS consumables ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name varchar(64) NOT NULL, category varchar(32) NOT NULL, @@ -364,9 +364,9 @@ CREATE TABLE consumables ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_consumables_category ON consumables (category); +CREATE INDEX IF NOT EXISTS idx_consumables_category ON consumables (category); -CREATE TABLE consultations ( +CREATE TABLE IF NOT EXISTS consultations ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), room_id uuid, batch_id uuid, @@ -384,11 +384,11 @@ CREATE TABLE consultations ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_consultations_lamp_test_id ON consultations (lamp_test_id); -CREATE INDEX idx_consultations_batch_id ON consultations (batch_id); -CREATE INDEX idx_consultations_room_id ON consultations (room_id); +CREATE INDEX IF NOT EXISTS idx_consultations_lamp_test_id ON consultations (lamp_test_id); +CREATE INDEX IF NOT EXISTS idx_consultations_batch_id ON consultations (batch_id); +CREATE INDEX IF NOT EXISTS idx_consultations_room_id ON consultations (room_id); -CREATE TABLE spectrum_entries ( +CREATE TABLE IF NOT EXISTS spectrum_entries ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), disease varchar(64) NOT NULL, source varchar(128), @@ -397,7 +397,7 @@ CREATE TABLE spectrum_entries ( created_at timestamptz NOT NULL DEFAULT now() ); -CREATE TABLE trace_records ( +CREATE TABLE IF NOT EXISTS trace_records ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), room_id uuid, lamp_test_id uuid, @@ -415,6 +415,7 @@ CREATE TABLE trace_records ( updated_at timestamptz NOT NULL DEFAULT now() ); -CREATE INDEX idx_trace_records_consultation_id ON trace_records (consultation_id); -CREATE INDEX idx_trace_records_lamp_test_id ON trace_records (lamp_test_id); -CREATE INDEX idx_trace_records_room_id ON trace_records (room_id); +CREATE INDEX IF NOT EXISTS idx_trace_records_consultation_id ON trace_records (consultation_id); +CREATE INDEX IF NOT EXISTS idx_trace_records_lamp_test_id ON trace_records (lamp_test_id); +CREATE INDEX IF NOT EXISTS idx_trace_records_room_id ON trace_records (room_id); + diff --git a/开发交接记录.md b/开发交接记录.md index 7133808..9ca5ec9 100644 --- a/开发交接记录.md +++ b/开发交接记录.md @@ -814,6 +814,7 @@ MVP 沿用 IoTDB(现状);TDengine 作为生产规模化候选(先基准 - 采用 `golang-migrate/migrate/v4 v4.18.2`,新增 `server-go/migrations/` 嵌入式迁移包; - 新增 `000001_baseline.up.sql` / `000001_baseline.down.sql`,覆盖当前 26 张业务表、索引和唯一约束; - 新增 `internal/database/migrate.go`:`RunMigrations`、`CheckSchemaVersion`、`CurrentSchemaVersion`; +- 上线前将 `000001_baseline.up.sql` 调整为 `CREATE TABLE/INDEX IF NOT EXISTS`,兼容已由 AutoMigrate 建表的开发库; - `database.Init` 改为先执行版本化迁移并校验 `schema_migrations`,生产环境忽略 `ALLOW_DEV_AUTOMIGRATE`;开发环境仅显式开启时允许 AutoMigrate; - `config.Config` 增加 `APP_ENV`、`ALLOW_DEV_AUTOMIGRATE`;README 与物理机部署指南补充迁移说明和环境变量; - 新增 sqlmock 测试,覆盖版本匹配、版本不匹配、空版本、dirty 状态和嵌入式迁移文件解析。