Merge branch 'dev-0.2.1' into dev-0.2

# Conflicts:
#	generated/prisma/internal/class.ts
#	generated/prisma/internal/prismaNamespace.ts
#	generated/prisma/internal/prismaNamespaceBrowser.ts
#	generated/prisma/models/BoardColumn.ts
#	generated/prisma/models/Project.ts
#	generated/prisma/models/ProjectMember.ts
#	generated/prisma/models/Task.ts
#	generated/prisma/models/TaskMember.ts
#	generated/prisma/models/TaskTag.ts
#	generated/prisma/models/User.ts
#	server/routes/projects.js
#	server/routes/tasks.js
#	src/api/task.js
This commit is contained in:
jif2.zhang
2026-10-26 20:46:25 +08:00
95 changed files with 8694 additions and 1609 deletions
@@ -1,62 +0,0 @@
-- CreateTable
CREATE TABLE `User` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(191) NOT NULL,
`email` VARCHAR(191) NOT NULL,
`password` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `User_email_key`(`email`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Article` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`title` VARCHAR(191) NOT NULL,
`slug` VARCHAR(191) NOT NULL,
`content` VARCHAR(191) NOT NULL,
`date` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `Article_slug_key`(`slug`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Strategy` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(191) NOT NULL,
`description` VARCHAR(191) NOT NULL,
`data` JSON NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Indicator` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(191) NOT NULL,
`groupName` VARCHAR(191) NOT NULL,
`data` JSON NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `SowInventory` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`month` VARCHAR(191) NOT NULL,
`inventory` INTEGER NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `SowInventory_month_key`(`month`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,20 +0,0 @@
/*
Warnings:
- You are about to drop the `SowInventory` table. If the table is not empty, all the data it contains will be lost.
*/
-- DropTable
DROP TABLE `SowInventory`;
-- CreateTable
CREATE TABLE `Econ_SowInventory` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`month` VARCHAR(191) NOT NULL,
`inventory` INTEGER NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `Econ_SowInventory_month_key`(`month`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,13 +0,0 @@
-- CreateTable
CREATE TABLE `ScraperCache` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`scraperName` VARCHAR(191) NOT NULL,
`lastDataHash` VARCHAR(191) NULL,
`lastUpdateAt` DATETIME(3) NOT NULL,
`metadata` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `ScraperCache_scraperName_key`(`scraperName`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,5 +0,0 @@
-- Add unique constraint on Strategy.name to enable idempotent upsert in seed script
ALTER TABLE `Strategy` ADD UNIQUE INDEX `Strategy_name_key`(`name`);
-- Add unique constraint on Indicator.name to enable idempotent upsert in seed script
ALTER TABLE `Indicator` ADD UNIQUE INDEX `Indicator_name_key`(`name`);
@@ -1,24 +0,0 @@
-- 经济指标: 明细数据拆到独立表, 兼容年/季/月/日频率
-- 第一步: 建 IndicatorPoint 表 + Indicator 加元数据列 (data 列暂保留, 由迁移脚本搬运后删除)
-- CreateTable
CREATE TABLE `IndicatorPoint` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`indicatorId` INTEGER NOT NULL,
`period` VARCHAR(191) NOT NULL,
`value` DOUBLE NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `IndicatorPoint_indicatorId_period_key`(`indicatorId`, `period`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AlterTable: 元数据列 (data JSON 拆出)
ALTER TABLE `Indicator` ADD COLUMN `title` VARCHAR(191) NOT NULL DEFAULT '',
ADD COLUMN `unit` VARCHAR(191) NOT NULL DEFAULT '',
ADD COLUMN `source` VARCHAR(191) NOT NULL DEFAULT '',
ADD COLUMN `frequency` VARCHAR(191) NOT NULL DEFAULT 'month';
-- AddForeignKey
ALTER TABLE `IndicatorPoint` ADD CONSTRAINT `IndicatorPoint_indicatorId_fkey` FOREIGN KEY (`indicatorId`) REFERENCES `Indicator`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,3 +0,0 @@
-- 第二步: 明细数据已迁移到 IndicatorPoint, 删除 Indicator.data JSON 列
-- AlterTable
ALTER TABLE `Indicator` DROP COLUMN `data`;
@@ -1,2 +0,0 @@
-- 指标隐藏标记: 数据与获取脚本保留, 前端展示过滤 hidden=true
ALTER TABLE `Indicator` ADD COLUMN `hidden` BOOLEAN NOT NULL DEFAULT false;
@@ -1,32 +0,0 @@
-- CreateTable
CREATE TABLE `News` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`title` VARCHAR(191) NOT NULL,
`summary` VARCHAR(191) NOT NULL DEFAULT '',
`source` VARCHAR(191) NOT NULL DEFAULT '',
`url` VARCHAR(191) NOT NULL DEFAULT '',
`publishedAt` DATETIME(3) NOT NULL,
`impactRank` INTEGER NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `News_title_publishedAt_key`(`title`, `publishedAt`),
INDEX `News_publishedAt_idx`(`publishedAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Alert` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`indicatorName` VARCHAR(191) NOT NULL,
`period` VARCHAR(191) NOT NULL,
`valueA` DOUBLE NOT NULL,
`valueB` DOUBLE NOT NULL,
`sourceA` VARCHAR(191) NOT NULL,
`sourceB` VARCHAR(191) NOT NULL,
`diff` DOUBLE NOT NULL,
`diffRatio` DOUBLE NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `Alert_createdAt_idx`(`createdAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,68 +0,0 @@
-- 服务器监控 + 服务健康检查
-- CreateTable
CREATE TABLE `ServerNode` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`uuid` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`cpuName` VARCHAR(191) NOT NULL DEFAULT '',
`os` VARCHAR(191) NOT NULL DEFAULT '',
`region` VARCHAR(191) NOT NULL DEFAULT '',
`memTotal` BIGINT NOT NULL DEFAULT 0,
`diskTotal` BIGINT NOT NULL DEFAULT 0,
`cpuCores` INTEGER NOT NULL DEFAULT 0,
`cpuUsage` DOUBLE NOT NULL DEFAULT 0,
`ramUsed` BIGINT NOT NULL DEFAULT 0,
`swapUsed` BIGINT NOT NULL DEFAULT 0,
`load1` DOUBLE NOT NULL DEFAULT 0,
`load5` DOUBLE NOT NULL DEFAULT 0,
`load15` DOUBLE NOT NULL DEFAULT 0,
`diskUsed` BIGINT NOT NULL DEFAULT 0,
`netIn` BIGINT NOT NULL DEFAULT 0,
`netOut` BIGINT NOT NULL DEFAULT 0,
`uptime` BIGINT NOT NULL DEFAULT 0,
`process` INTEGER NOT NULL DEFAULT 0,
`connections` INTEGER NOT NULL DEFAULT 0,
`status` VARCHAR(191) NOT NULL DEFAULT 'unknown',
`recordedAt` DATETIME(3) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `ServerNode_uuid_key`(`uuid`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ServerNodeHistory` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`uuid` VARCHAR(191) NOT NULL,
`period` DATETIME(3) NOT NULL,
`cpu` DOUBLE NOT NULL DEFAULT 0,
`ram` BIGINT NOT NULL DEFAULT 0,
`load` DOUBLE NOT NULL DEFAULT 0,
`disk` BIGINT NOT NULL DEFAULT 0,
`netIn` BIGINT NOT NULL DEFAULT 0,
`netOut` BIGINT NOT NULL DEFAULT 0,
`process` INTEGER NOT NULL DEFAULT 0,
`connections` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `ServerNodeHistory_uuid_period_key`(`uuid`, `period`),
INDEX `ServerNodeHistory_uuid_period_idx`(`uuid`, `period`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ServiceCheck` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(191) NOT NULL,
`url` VARCHAR(191) NOT NULL,
`status` VARCHAR(191) NOT NULL DEFAULT 'unknown',
`latencyMs` INTEGER NOT NULL DEFAULT 0,
`message` VARCHAR(191) NOT NULL DEFAULT '',
`lastCheckAt` DATETIME(3) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `ServiceCheck_name_key`(`name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,2 +0,0 @@
-- AlterTable (news.content 全文, 须在 news_and_alerts 建表之后执行)
ALTER TABLE `News` ADD COLUMN `content` TEXT NULL;
@@ -1,17 +0,0 @@
-- 浙江省油价历史表
-- - date: 调价日次日 (即数据实际抓取日, 便于按时间排序)
-- - province + fuel: 浙江 / 92/95/0
-- - unique (date, province, fuel): 防 cron 重复入库
-- - DOUBLE 容纳 999.999 元/升
CREATE TABLE OilPriceHistory (
id INT NOT NULL AUTO_INCREMENT,
date DATETIME(3) NOT NULL,
province VARCHAR(191) NOT NULL,
fuel VARCHAR(8) NOT NULL,
price DOUBLE NOT NULL,
source VARCHAR(191) NOT NULL DEFAULT 'apizero',
createdAt DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE INDEX OilPriceHistory_date_province_fuel_key(date, province, fuel),
INDEX OilPriceHistory_province_fuel_date_idx(province, fuel, date)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -1,95 +0,0 @@
-- CreateTable
CREATE TABLE `MihomeAccount` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`key` VARCHAR(191) NOT NULL DEFAULT 'default',
`userId` VARCHAR(191) NOT NULL DEFAULT '',
`status` VARCHAR(191) NOT NULL DEFAULT 'unknown',
`lastError` VARCHAR(191) NOT NULL DEFAULT '',
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `MihomeAccount_key_key`(`key`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `MihomeHome` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`homeId` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `MihomeHome_homeId_key`(`homeId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `MihomeDevice` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`did` VARCHAR(191) NOT NULL,
`homeId` VARCHAR(191) NOT NULL,
`model` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`alias` VARCHAR(191) NULL,
`tempSiid` INTEGER NOT NULL,
`tempPiid` INTEGER NOT NULL,
`humSiid` INTEGER NOT NULL,
`humPiid` INTEGER NOT NULL,
`battSiid` INTEGER NOT NULL,
`battPiid` INTEGER NOT NULL,
`battery` INTEGER NULL,
`batteryAt` DATETIME(3) NULL,
`enabled` BOOLEAN NOT NULL DEFAULT true,
`lastSyncAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `MihomeDevice_did_key`(`did`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `MihomeEnvSample` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`deviceId` INTEGER NOT NULL,
`date` DATETIME(3) NOT NULL,
`temperature` DOUBLE NULL,
`humidity` DOUBLE NULL,
`temperatureAvg` DOUBLE NULL,
`humidityAvg` DOUBLE NULL,
`temperatureMin` DOUBLE NULL,
`temperatureMax` DOUBLE NULL,
`humidityMin` DOUBLE NULL,
`humidityMax` DOUBLE NULL,
`origin` VARCHAR(191) NOT NULL DEFAULT 'live',
`sampledAt` DATETIME(3) NULL,
`raw` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `MihomeEnvSample_deviceId_date_idx`(`deviceId`, `date`),
UNIQUE INDEX `MihomeEnvSample_deviceId_date_key`(`deviceId`, `date`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `MihomeEnvHour` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`deviceId` INTEGER NOT NULL,
`hour` DATETIME(3) NOT NULL,
`temperatureAvg` DOUBLE NULL,
`humidityAvg` DOUBLE NULL,
`raw` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `MihomeEnvHour_deviceId_hour_idx`(`deviceId`, `hour`),
UNIQUE INDEX `MihomeEnvHour_deviceId_hour_key`(`deviceId`, `hour`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `MihomeDevice` ADD CONSTRAINT `MihomeDevice_homeId_fkey` FOREIGN KEY (`homeId`) REFERENCES `MihomeHome`(`homeId`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `MihomeEnvSample` ADD CONSTRAINT `MihomeEnvSample_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `MihomeDevice`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `MihomeEnvHour` ADD CONSTRAINT `MihomeEnvHour_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `MihomeDevice`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,99 +0,0 @@
-- CreateTable
CREATE TABLE `Habit` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`userId` INTEGER NOT NULL,
`name` VARCHAR(191) NOT NULL,
`period` VARCHAR(191) NOT NULL DEFAULT 'day',
`target` INTEGER NOT NULL DEFAULT 1,
`color` VARCHAR(191) NOT NULL DEFAULT '#1677ff',
`icon` VARCHAR(191) NOT NULL DEFAULT '',
`note` VARCHAR(191) NOT NULL DEFAULT '',
`archived` BOOLEAN NOT NULL DEFAULT false,
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `Habit_userId_archived_sortOrder_idx`(`userId`, `archived`, `sortOrder`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `CheckIn` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`habitId` INTEGER NOT NULL,
`userId` INTEGER NOT NULL,
`date` VARCHAR(10) NOT NULL,
`seq` INTEGER NOT NULL DEFAULT 1,
`note` VARCHAR(191) NOT NULL DEFAULT '',
`source` VARCHAR(191) NOT NULL DEFAULT 'user',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `CheckIn_habitId_date_seq_key`(`habitId`, `date`, `seq`),
INDEX `CheckIn_userId_date_idx`(`userId`, `date`),
INDEX `CheckIn_habitId_date_idx`(`habitId`, `date`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `CheckList` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`userId` INTEGER NOT NULL,
`title` VARCHAR(191) NOT NULL,
`scene` VARCHAR(191) NOT NULL DEFAULT '',
`note` VARCHAR(191) NOT NULL DEFAULT '',
`archived` BOOLEAN NOT NULL DEFAULT false,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `CheckList_userId_archived_idx`(`userId`, `archived`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `CheckListItem` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`listId` INTEGER NOT NULL,
`title` VARCHAR(191) NOT NULL,
`note` VARCHAR(191) NOT NULL DEFAULT '',
`done` BOOLEAN NOT NULL DEFAULT false,
`doneAt` DATETIME(3) NULL,
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `CheckListItem_listId_sortOrder_idx`(`listId`, `sortOrder`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `CheckListTemplate` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`userId` INTEGER NULL,
`name` VARCHAR(191) NOT NULL,
`scene` VARCHAR(191) NOT NULL DEFAULT '',
`items` JSON NOT NULL,
`builtin` BOOLEAN NOT NULL DEFAULT false,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `CheckListTemplate_userId_builtin_idx`(`userId`, `builtin`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `Habit` ADD CONSTRAINT `Habit_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `CheckIn` ADD CONSTRAINT `CheckIn_habitId_fkey` FOREIGN KEY (`habitId`) REFERENCES `Habit`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `CheckIn` ADD CONSTRAINT `CheckIn_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `CheckList` ADD CONSTRAINT `CheckList_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `CheckListItem` ADD CONSTRAINT `CheckListItem_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `CheckList`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `CheckListTemplate` ADD CONSTRAINT `CheckListTemplate_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,126 +0,0 @@
-- 任务模块 (V0.2): 项目 / 成员 / 看板列 / 任务 / 任务成员 / 标签
-- 设计口径见 docs/V0.2/任务模块/任务模块数据库设计文档.md
-- CreateTable
CREATE TABLE `Project` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`ownerId` INTEGER NOT NULL,
`isPersonal` BOOLEAN NOT NULL DEFAULT false,
`archived` BOOLEAN NOT NULL DEFAULT false,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `Project_ownerId_idx`(`ownerId`),
INDEX `Project_archived_idx`(`archived`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ProjectMember` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`projectId` INTEGER NOT NULL,
`userId` INTEGER NOT NULL,
`permission` VARCHAR(191) NOT NULL DEFAULT 'member',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `ProjectMember_projectId_userId_key`(`projectId`, `userId`),
INDEX `ProjectMember_userId_idx`(`userId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `BoardColumn` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`projectId` INTEGER NOT NULL,
`name` VARCHAR(20) NOT NULL,
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`boundStatus` VARCHAR(8) NULL,
`retention` VARCHAR(8) NOT NULL DEFAULT 'forever',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `BoardColumn_projectId_name_key`(`projectId`, `name`),
INDEX `BoardColumn_projectId_sortOrder_idx`(`projectId`, `sortOrder`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Task` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`projectId` INTEGER NOT NULL,
`columnId` INTEGER NOT NULL,
`parentId` INTEGER NULL,
`title` VARCHAR(200) NOT NULL,
`description` TEXT NOT NULL,
`status` VARCHAR(8) NOT NULL DEFAULT 'todo',
`doneAt` DATETIME(3) NULL,
`assigneeId` INTEGER NULL,
`creatorId` INTEGER NOT NULL,
`extras` JSON NOT NULL,
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `Task_projectId_columnId_idx`(`projectId`, `columnId`),
INDEX `Task_projectId_status_idx`(`projectId`, `status`),
INDEX `Task_parentId_idx`(`parentId`),
INDEX `Task_projectId_doneAt_idx`(`projectId`, `doneAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `TaskMember` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`taskId` INTEGER NOT NULL,
`userId` INTEGER NOT NULL,
UNIQUE INDEX `TaskMember_taskId_userId_key`(`taskId`, `userId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `TaskTag` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`taskId` INTEGER NOT NULL,
`name` VARCHAR(20) NOT NULL,
INDEX `TaskTag_taskId_idx`(`taskId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `Project` ADD CONSTRAINT `Project_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ProjectMember` ADD CONSTRAINT `ProjectMember_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `ProjectMember` ADD CONSTRAINT `ProjectMember_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `BoardColumn` ADD CONSTRAINT `BoardColumn_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Task` ADD CONSTRAINT `Task_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Task` ADD CONSTRAINT `Task_columnId_fkey` FOREIGN KEY (`columnId`) REFERENCES `BoardColumn`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Task` ADD CONSTRAINT `Task_parentId_fkey` FOREIGN KEY (`parentId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Task` ADD CONSTRAINT `Task_assigneeId_fkey` FOREIGN KEY (`assigneeId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Task` ADD CONSTRAINT `Task_creatorId_fkey` FOREIGN KEY (`creatorId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `TaskMember` ADD CONSTRAINT `TaskMember_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `TaskMember` ADD CONSTRAINT `TaskMember_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `TaskTag` ADD CONSTRAINT `TaskTag_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,7 +0,0 @@
-- 项目信息块 (T-PJ-13): Project 增加 notes JSON, 存 [{ title, content }] 任意多个长文本块
-- 分三步保证存量行安全: 先可空加列 -> 回填 '[]' -> 收紧为 NOT NULL
ALTER TABLE `Project` ADD COLUMN `notes` JSON NULL;
UPDATE `Project` SET `notes` = '[]' WHERE `notes` IS NULL;
ALTER TABLE `Project` MODIFY `notes` JSON NOT NULL;
@@ -1,3 +0,0 @@
-- 任务类型标签: 项目级自定义列表 + 任务上的类型
ALTER TABLE `Project` ADD COLUMN `taskKinds` JSON NULL;
ALTER TABLE `Task` ADD COLUMN `kind` VARCHAR(20) NULL;
@@ -1,2 +0,0 @@
-- 任务时间标记: 完整日期存储, 前端展示 MM-dd
ALTER TABLE `Task` ADD COLUMN `markDate` DATETIME(3) NULL;
@@ -1,2 +0,0 @@
-- 项目图标: data URL (客户端裁剪 96x96 JPEG, 约 10-20KB)
ALTER TABLE `Project` ADD COLUMN `icon` TEXT NULL;
@@ -0,0 +1,655 @@
-- CreateSchema
CREATE SCHEMA IF NOT EXISTS "public";
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"email" TEXT NOT NULL,
"password" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Article" (
"id" SERIAL NOT NULL,
"title" TEXT NOT NULL,
"slug" TEXT NOT NULL,
"content" TEXT NOT NULL,
"date" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Article_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Strategy" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL,
"data" JSONB NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Strategy_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Indicator" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"groupName" TEXT NOT NULL,
"title" TEXT NOT NULL DEFAULT '',
"unit" TEXT NOT NULL DEFAULT '',
"source" TEXT NOT NULL DEFAULT '',
"frequency" TEXT NOT NULL DEFAULT 'month',
"hidden" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Indicator_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "IndicatorPoint" (
"id" SERIAL NOT NULL,
"indicatorId" INTEGER NOT NULL,
"period" TEXT NOT NULL,
"value" DOUBLE PRECISION NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "IndicatorPoint_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "News" (
"id" SERIAL NOT NULL,
"title" TEXT NOT NULL,
"summary" TEXT NOT NULL DEFAULT '',
"content" TEXT,
"source" TEXT NOT NULL DEFAULT '',
"url" TEXT NOT NULL DEFAULT '',
"publishedAt" TIMESTAMP(3) NOT NULL,
"impactRank" INTEGER NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "News_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Alert" (
"id" SERIAL NOT NULL,
"indicatorName" TEXT NOT NULL,
"period" TEXT NOT NULL,
"valueA" DOUBLE PRECISION NOT NULL,
"valueB" DOUBLE PRECISION NOT NULL,
"sourceA" TEXT NOT NULL,
"sourceB" TEXT NOT NULL,
"diff" DOUBLE PRECISION NOT NULL,
"diffRatio" DOUBLE PRECISION NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "Alert_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ServerNode" (
"id" SERIAL NOT NULL,
"uuid" TEXT NOT NULL,
"name" TEXT NOT NULL,
"cpuName" TEXT NOT NULL DEFAULT '',
"os" TEXT NOT NULL DEFAULT '',
"region" TEXT NOT NULL DEFAULT '',
"memTotal" BIGINT NOT NULL DEFAULT 0,
"diskTotal" BIGINT NOT NULL DEFAULT 0,
"cpuCores" INTEGER NOT NULL DEFAULT 0,
"cpuUsage" DOUBLE PRECISION NOT NULL DEFAULT 0,
"ramUsed" BIGINT NOT NULL DEFAULT 0,
"swapUsed" BIGINT NOT NULL DEFAULT 0,
"load1" DOUBLE PRECISION NOT NULL DEFAULT 0,
"load5" DOUBLE PRECISION NOT NULL DEFAULT 0,
"load15" DOUBLE PRECISION NOT NULL DEFAULT 0,
"diskUsed" BIGINT NOT NULL DEFAULT 0,
"netIn" BIGINT NOT NULL DEFAULT 0,
"netOut" BIGINT NOT NULL DEFAULT 0,
"uptime" BIGINT NOT NULL DEFAULT 0,
"process" INTEGER NOT NULL DEFAULT 0,
"connections" INTEGER NOT NULL DEFAULT 0,
"status" TEXT NOT NULL DEFAULT 'unknown',
"recordedAt" TIMESTAMP(3) NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ServerNode_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ServerNodeHistory" (
"id" SERIAL NOT NULL,
"uuid" TEXT NOT NULL,
"period" TIMESTAMP(3) NOT NULL,
"cpu" DOUBLE PRECISION NOT NULL DEFAULT 0,
"ram" BIGINT NOT NULL DEFAULT 0,
"load" DOUBLE PRECISION NOT NULL DEFAULT 0,
"disk" BIGINT NOT NULL DEFAULT 0,
"netIn" BIGINT NOT NULL DEFAULT 0,
"netOut" BIGINT NOT NULL DEFAULT 0,
"process" INTEGER NOT NULL DEFAULT 0,
"connections" INTEGER NOT NULL DEFAULT 0,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ServerNodeHistory_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ServiceCheck" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"url" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'unknown',
"latencyMs" INTEGER NOT NULL DEFAULT 0,
"message" TEXT NOT NULL DEFAULT '',
"lastCheckAt" TIMESTAMP(3) NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ServiceCheck_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Econ_SowInventory" (
"id" SERIAL NOT NULL,
"month" TEXT NOT NULL,
"inventory" INTEGER NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Econ_SowInventory_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ScraperCache" (
"id" SERIAL NOT NULL,
"scraperName" TEXT NOT NULL,
"lastDataHash" TEXT,
"lastUpdateAt" TIMESTAMP(3) NOT NULL,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ScraperCache_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "OilPriceHistory" (
"id" SERIAL NOT NULL,
"date" TIMESTAMP(3) NOT NULL,
"province" TEXT NOT NULL,
"fuel" TEXT NOT NULL,
"price" DOUBLE PRECISION NOT NULL,
"source" TEXT NOT NULL DEFAULT 'apizero',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "OilPriceHistory_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "MihomeAccount" (
"id" SERIAL NOT NULL,
"key" TEXT NOT NULL DEFAULT 'default',
"userId" TEXT NOT NULL DEFAULT '',
"status" TEXT NOT NULL DEFAULT 'unknown',
"lastError" TEXT NOT NULL DEFAULT '',
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "MihomeAccount_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "MihomeHome" (
"id" SERIAL NOT NULL,
"homeId" TEXT NOT NULL,
"name" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "MihomeHome_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "MihomeDevice" (
"id" SERIAL NOT NULL,
"did" TEXT NOT NULL,
"homeId" TEXT NOT NULL,
"model" TEXT NOT NULL,
"name" TEXT NOT NULL,
"alias" TEXT,
"tempSiid" INTEGER NOT NULL,
"tempPiid" INTEGER NOT NULL,
"humSiid" INTEGER NOT NULL,
"humPiid" INTEGER NOT NULL,
"battSiid" INTEGER NOT NULL,
"battPiid" INTEGER NOT NULL,
"battery" INTEGER,
"batteryAt" TIMESTAMP(3),
"enabled" BOOLEAN NOT NULL DEFAULT true,
"lastSyncAt" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "MihomeDevice_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "MihomeEnvSample" (
"id" SERIAL NOT NULL,
"deviceId" INTEGER NOT NULL,
"date" TIMESTAMP(3) NOT NULL,
"temperature" DOUBLE PRECISION,
"humidity" DOUBLE PRECISION,
"temperatureAvg" DOUBLE PRECISION,
"humidityAvg" DOUBLE PRECISION,
"temperatureMin" DOUBLE PRECISION,
"temperatureMax" DOUBLE PRECISION,
"humidityMin" DOUBLE PRECISION,
"humidityMax" DOUBLE PRECISION,
"origin" TEXT NOT NULL DEFAULT 'live',
"sampledAt" TIMESTAMP(3),
"raw" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "MihomeEnvSample_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "MihomeEnvHour" (
"id" SERIAL NOT NULL,
"deviceId" INTEGER NOT NULL,
"hour" TIMESTAMP(3) NOT NULL,
"temperatureAvg" DOUBLE PRECISION,
"humidityAvg" DOUBLE PRECISION,
"raw" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "MihomeEnvHour_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Habit" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"name" TEXT NOT NULL,
"period" TEXT NOT NULL DEFAULT 'day',
"target" INTEGER NOT NULL DEFAULT 1,
"color" TEXT NOT NULL DEFAULT '#1677ff',
"icon" TEXT NOT NULL DEFAULT '',
"note" TEXT NOT NULL DEFAULT '',
"archived" BOOLEAN NOT NULL DEFAULT false,
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Habit_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "CheckIn" (
"id" SERIAL NOT NULL,
"habitId" INTEGER NOT NULL,
"userId" INTEGER NOT NULL,
"date" VARCHAR(10) NOT NULL,
"seq" INTEGER NOT NULL DEFAULT 1,
"note" TEXT NOT NULL DEFAULT '',
"source" TEXT NOT NULL DEFAULT 'user',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "CheckIn_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "CheckList" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"title" TEXT NOT NULL,
"scene" TEXT NOT NULL DEFAULT '',
"note" TEXT NOT NULL DEFAULT '',
"archived" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "CheckList_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "CheckListItem" (
"id" SERIAL NOT NULL,
"listId" INTEGER NOT NULL,
"title" TEXT NOT NULL,
"note" TEXT NOT NULL DEFAULT '',
"done" BOOLEAN NOT NULL DEFAULT false,
"doneAt" TIMESTAMP(3),
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "CheckListItem_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "CheckListTemplate" (
"id" SERIAL NOT NULL,
"userId" INTEGER,
"name" TEXT NOT NULL,
"scene" TEXT NOT NULL DEFAULT '',
"items" JSONB NOT NULL,
"builtin" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "CheckListTemplate_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Project" (
"id" SERIAL NOT NULL,
"uuid" VARCHAR(36) NOT NULL,
"code" VARCHAR(8) NOT NULL,
"name" VARCHAR(50) NOT NULL,
"ownerId" INTEGER NOT NULL,
"isPersonal" BOOLEAN NOT NULL DEFAULT false,
"archived" BOOLEAN NOT NULL DEFAULT false,
"notes" JSONB NOT NULL DEFAULT '[]',
"taskKinds" JSONB,
"icon" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ProjectMember" (
"id" SERIAL NOT NULL,
"uuid" VARCHAR(36) NOT NULL,
"projectId" INTEGER NOT NULL,
"userId" INTEGER NOT NULL,
"permission" TEXT NOT NULL DEFAULT 'member',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ProjectMember_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "BoardColumn" (
"id" SERIAL NOT NULL,
"uuid" VARCHAR(36) NOT NULL,
"projectId" INTEGER NOT NULL,
"name" VARCHAR(20) NOT NULL,
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"boundStatus" VARCHAR(8),
"retention" VARCHAR(8) NOT NULL DEFAULT 'forever',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "BoardColumn_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Task" (
"id" SERIAL NOT NULL,
"uuid" VARCHAR(36) NOT NULL,
"projectId" INTEGER NOT NULL,
"columnId" INTEGER NOT NULL,
"parentId" INTEGER,
"title" VARCHAR(200) NOT NULL,
"description" TEXT NOT NULL DEFAULT '',
"kind" VARCHAR(20),
"markDate" TIMESTAMP(3),
"status" VARCHAR(8) NOT NULL DEFAULT 'todo',
"doneAt" TIMESTAMP(3),
"assigneeId" INTEGER,
"creatorId" INTEGER NOT NULL,
"extras" JSONB NOT NULL DEFAULT '[]',
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
"number" INTEGER,
CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "TaskMember" (
"id" SERIAL NOT NULL,
"uuid" VARCHAR(36) NOT NULL,
"taskId" INTEGER NOT NULL,
"userId" INTEGER NOT NULL,
CONSTRAINT "TaskMember_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "TaskTag" (
"id" SERIAL NOT NULL,
"uuid" VARCHAR(36) NOT NULL,
"taskId" INTEGER NOT NULL,
"name" VARCHAR(20) NOT NULL,
CONSTRAINT "TaskTag_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-- CreateIndex
CREATE UNIQUE INDEX "Article_slug_key" ON "Article"("slug");
-- CreateIndex
CREATE UNIQUE INDEX "Indicator_name_key" ON "Indicator"("name");
-- CreateIndex
CREATE UNIQUE INDEX "IndicatorPoint_indicatorId_period_key" ON "IndicatorPoint"("indicatorId", "period");
-- CreateIndex
CREATE INDEX "News_publishedAt_idx" ON "News"("publishedAt");
-- CreateIndex
CREATE UNIQUE INDEX "News_title_publishedAt_key" ON "News"("title", "publishedAt");
-- CreateIndex
CREATE INDEX "Alert_createdAt_idx" ON "Alert"("createdAt");
-- CreateIndex
CREATE UNIQUE INDEX "ServerNode_uuid_key" ON "ServerNode"("uuid");
-- CreateIndex
CREATE INDEX "ServerNodeHistory_uuid_period_idx" ON "ServerNodeHistory"("uuid", "period");
-- CreateIndex
CREATE UNIQUE INDEX "ServerNodeHistory_uuid_period_key" ON "ServerNodeHistory"("uuid", "period");
-- CreateIndex
CREATE UNIQUE INDEX "ServiceCheck_name_key" ON "ServiceCheck"("name");
-- CreateIndex
CREATE UNIQUE INDEX "Econ_SowInventory_month_key" ON "Econ_SowInventory"("month");
-- CreateIndex
CREATE UNIQUE INDEX "ScraperCache_scraperName_key" ON "ScraperCache"("scraperName");
-- CreateIndex
CREATE INDEX "OilPriceHistory_province_fuel_date_idx" ON "OilPriceHistory"("province", "fuel", "date");
-- CreateIndex
CREATE UNIQUE INDEX "OilPriceHistory_date_province_fuel_key" ON "OilPriceHistory"("date", "province", "fuel");
-- CreateIndex
CREATE UNIQUE INDEX "MihomeAccount_key_key" ON "MihomeAccount"("key");
-- CreateIndex
CREATE UNIQUE INDEX "MihomeHome_homeId_key" ON "MihomeHome"("homeId");
-- CreateIndex
CREATE UNIQUE INDEX "MihomeDevice_did_key" ON "MihomeDevice"("did");
-- CreateIndex
CREATE INDEX "MihomeEnvSample_deviceId_date_idx" ON "MihomeEnvSample"("deviceId", "date");
-- CreateIndex
CREATE UNIQUE INDEX "MihomeEnvSample_deviceId_date_key" ON "MihomeEnvSample"("deviceId", "date");
-- CreateIndex
CREATE INDEX "MihomeEnvHour_deviceId_hour_idx" ON "MihomeEnvHour"("deviceId", "hour");
-- CreateIndex
CREATE UNIQUE INDEX "MihomeEnvHour_deviceId_hour_key" ON "MihomeEnvHour"("deviceId", "hour");
-- CreateIndex
CREATE INDEX "Habit_userId_archived_sortOrder_idx" ON "Habit"("userId", "archived", "sortOrder");
-- CreateIndex
CREATE INDEX "CheckIn_userId_date_idx" ON "CheckIn"("userId", "date");
-- CreateIndex
CREATE INDEX "CheckIn_habitId_date_idx" ON "CheckIn"("habitId", "date");
-- CreateIndex
CREATE UNIQUE INDEX "CheckIn_habitId_date_seq_key" ON "CheckIn"("habitId", "date", "seq");
-- CreateIndex
CREATE INDEX "CheckList_userId_archived_idx" ON "CheckList"("userId", "archived");
-- CreateIndex
CREATE INDEX "CheckListItem_listId_sortOrder_idx" ON "CheckListItem"("listId", "sortOrder");
-- CreateIndex
CREATE INDEX "CheckListTemplate_userId_builtin_idx" ON "CheckListTemplate"("userId", "builtin");
-- CreateIndex
CREATE UNIQUE INDEX "Project_uuid_key" ON "Project"("uuid");
-- CreateIndex
CREATE UNIQUE INDEX "Project_code_key" ON "Project"("code");
-- CreateIndex
CREATE INDEX "Project_ownerId_idx" ON "Project"("ownerId");
-- CreateIndex
CREATE INDEX "Project_archived_idx" ON "Project"("archived");
-- CreateIndex
CREATE UNIQUE INDEX "ProjectMember_uuid_key" ON "ProjectMember"("uuid");
-- CreateIndex
CREATE INDEX "ProjectMember_userId_idx" ON "ProjectMember"("userId");
-- CreateIndex
CREATE UNIQUE INDEX "ProjectMember_projectId_userId_key" ON "ProjectMember"("projectId", "userId");
-- CreateIndex
CREATE UNIQUE INDEX "BoardColumn_uuid_key" ON "BoardColumn"("uuid");
-- CreateIndex
CREATE INDEX "BoardColumn_projectId_sortOrder_idx" ON "BoardColumn"("projectId", "sortOrder");
-- CreateIndex
CREATE UNIQUE INDEX "BoardColumn_projectId_name_key" ON "BoardColumn"("projectId", "name");
-- CreateIndex
CREATE UNIQUE INDEX "Task_uuid_key" ON "Task"("uuid");
-- CreateIndex
CREATE INDEX "Task_projectId_columnId_idx" ON "Task"("projectId", "columnId");
-- CreateIndex
CREATE INDEX "Task_projectId_status_idx" ON "Task"("projectId", "status");
-- CreateIndex
CREATE INDEX "Task_parentId_idx" ON "Task"("parentId");
-- CreateIndex
CREATE INDEX "Task_projectId_doneAt_idx" ON "Task"("projectId", "doneAt");
-- CreateIndex
CREATE UNIQUE INDEX "Task_projectId_number_key" ON "Task"("projectId", "number");
-- CreateIndex
CREATE UNIQUE INDEX "TaskMember_uuid_key" ON "TaskMember"("uuid");
-- CreateIndex
CREATE UNIQUE INDEX "TaskMember_taskId_userId_key" ON "TaskMember"("taskId", "userId");
-- CreateIndex
CREATE UNIQUE INDEX "TaskTag_uuid_key" ON "TaskTag"("uuid");
-- CreateIndex
CREATE INDEX "TaskTag_taskId_idx" ON "TaskTag"("taskId");
-- AddForeignKey
ALTER TABLE "IndicatorPoint" ADD CONSTRAINT "IndicatorPoint_indicatorId_fkey" FOREIGN KEY ("indicatorId") REFERENCES "Indicator"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MihomeDevice" ADD CONSTRAINT "MihomeDevice_homeId_fkey" FOREIGN KEY ("homeId") REFERENCES "MihomeHome"("homeId") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MihomeEnvSample" ADD CONSTRAINT "MihomeEnvSample_deviceId_fkey" FOREIGN KEY ("deviceId") REFERENCES "MihomeDevice"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "MihomeEnvHour" ADD CONSTRAINT "MihomeEnvHour_deviceId_fkey" FOREIGN KEY ("deviceId") REFERENCES "MihomeDevice"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Habit" ADD CONSTRAINT "Habit_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CheckIn" ADD CONSTRAINT "CheckIn_habitId_fkey" FOREIGN KEY ("habitId") REFERENCES "Habit"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CheckIn" ADD CONSTRAINT "CheckIn_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CheckList" ADD CONSTRAINT "CheckList_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CheckListItem" ADD CONSTRAINT "CheckListItem_listId_fkey" FOREIGN KEY ("listId") REFERENCES "CheckList"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CheckListTemplate" ADD CONSTRAINT "CheckListTemplate_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Project" ADD CONSTRAINT "Project_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "ProjectMember" ADD CONSTRAINT "ProjectMember_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "ProjectMember" ADD CONSTRAINT "ProjectMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "BoardColumn" ADD CONSTRAINT "BoardColumn_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Task" ADD CONSTRAINT "Task_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Task" ADD CONSTRAINT "Task_columnId_fkey" FOREIGN KEY ("columnId") REFERENCES "BoardColumn"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Task" ADD CONSTRAINT "Task_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Task"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Task" ADD CONSTRAINT "Task_assigneeId_fkey" FOREIGN KEY ("assigneeId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Task" ADD CONSTRAINT "Task_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "TaskMember" ADD CONSTRAINT "TaskMember_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "TaskMember" ADD CONSTRAINT "TaskMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "TaskTag" ADD CONSTRAINT "TaskTag_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,96 @@
-- uuid 外键镜像 (PowerSync Sequential ID Mapping, 见 docs/V0.2/离线编辑模块/0.2.1实施方案.md §3)
-- 目的: 同步流以 uuid 作为客户端主键 (离线新建行同步回填后本地 id 稳定不变),
-- 外键列同步输出 uuid 镜像 (别名回 projectId/columnId/parentId/taskId), 客户端零改动。
-- 镜像列由触发器维护: REST/Prisma 写 int 外键 -> 触发器回填 uuid; upload 端在应用层解析 uuid -> int。
-- 1) 加列 (先可空)
ALTER TABLE "BoardColumn" ADD COLUMN "projectUuid" VARCHAR(36);
ALTER TABLE "Task" ADD COLUMN "projectUuid" VARCHAR(36), ADD COLUMN "columnUuid" VARCHAR(36), ADD COLUMN "parentUuid" VARCHAR(36);
ALTER TABLE "ProjectMember" ADD COLUMN "projectUuid" VARCHAR(36);
ALTER TABLE "TaskMember" ADD COLUMN "taskUuid" VARCHAR(36);
ALTER TABLE "TaskTag" ADD COLUMN "taskUuid" VARCHAR(36);
-- 2) 存量回填
UPDATE "BoardColumn" c SET "projectUuid" = p."uuid" FROM "Project" p WHERE c."projectId" = p."id";
UPDATE "Task" t SET "projectUuid" = p."uuid" FROM "Project" p WHERE t."projectId" = p."id";
UPDATE "Task" t SET "columnUuid" = c."uuid" FROM "BoardColumn" c WHERE t."columnId" = c."id";
UPDATE "Task" t SET "parentUuid" = pt."uuid" FROM "Task" pt WHERE t."parentId" = pt."id";
UPDATE "ProjectMember" pm SET "projectUuid" = p."uuid" FROM "Project" p WHERE pm."projectId" = p."id";
UPDATE "TaskMember" tm SET "taskUuid" = t."uuid" FROM "Task" t WHERE tm."taskId" = t."id";
UPDATE "TaskTag" tt SET "taskUuid" = t."uuid" FROM "Task" t WHERE tt."taskId" = t."id";
-- 3) 非空约束
ALTER TABLE "BoardColumn" ALTER COLUMN "projectUuid" SET NOT NULL;
ALTER TABLE "Task" ALTER COLUMN "projectUuid" SET NOT NULL;
ALTER TABLE "Task" ALTER COLUMN "columnUuid" SET NOT NULL;
ALTER TABLE "ProjectMember" ALTER COLUMN "projectUuid" SET NOT NULL;
ALTER TABLE "TaskMember" ALTER COLUMN "taskUuid" SET NOT NULL;
ALTER TABLE "TaskTag" ALTER COLUMN "taskUuid" SET NOT NULL;
-- 4) 外键 (级联与 int 外键一致)
ALTER TABLE "BoardColumn" ADD CONSTRAINT "BoardColumn_projectUuid_fkey" FOREIGN KEY ("projectUuid") REFERENCES "Project"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "Task" ADD CONSTRAINT "Task_projectUuid_fkey" FOREIGN KEY ("projectUuid") REFERENCES "Project"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "Task" ADD CONSTRAINT "Task_columnUuid_fkey" FOREIGN KEY ("columnUuid") REFERENCES "BoardColumn"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "Task" ADD CONSTRAINT "Task_parentUuid_fkey" FOREIGN KEY ("parentUuid") REFERENCES "Task"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "ProjectMember" ADD CONSTRAINT "ProjectMember_projectUuid_fkey" FOREIGN KEY ("projectUuid") REFERENCES "Project"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "TaskMember" ADD CONSTRAINT "TaskMember_taskUuid_fkey" FOREIGN KEY ("taskUuid") REFERENCES "Task"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "TaskTag" ADD CONSTRAINT "TaskTag_taskUuid_fkey" FOREIGN KEY ("taskUuid") REFERENCES "Task"("uuid") ON DELETE CASCADE ON UPDATE CASCADE;
-- 5) 触发器: 写入时按 int 外键回填 uuid 镜像
CREATE OR REPLACE FUNCTION "func_projectmember_uuid_map"() RETURNS TRIGGER AS $$
BEGIN
SELECT "uuid" INTO NEW."projectUuid" FROM "Project" WHERE "id" = NEW."projectId";
IF NOT FOUND THEN RAISE EXCEPTION 'Project % 不存在', NEW."projectId"; END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "trg_projectmember_uuid_map" BEFORE INSERT OR UPDATE ON "ProjectMember"
FOR EACH ROW EXECUTE FUNCTION "func_projectmember_uuid_map"();
CREATE OR REPLACE FUNCTION "func_boardcolumn_uuid_map"() RETURNS TRIGGER AS $$
BEGIN
SELECT "uuid" INTO NEW."projectUuid" FROM "Project" WHERE "id" = NEW."projectId";
IF NOT FOUND THEN RAISE EXCEPTION 'Project % 不存在', NEW."projectId"; END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "trg_boardcolumn_uuid_map" BEFORE INSERT OR UPDATE ON "BoardColumn"
FOR EACH ROW EXECUTE FUNCTION "func_boardcolumn_uuid_map"();
CREATE OR REPLACE FUNCTION "func_task_uuid_map"() RETURNS TRIGGER AS $$
BEGIN
SELECT "uuid" INTO NEW."projectUuid" FROM "Project" WHERE "id" = NEW."projectId";
IF NOT FOUND THEN RAISE EXCEPTION 'Project % 不存在', NEW."projectId"; END IF;
SELECT "uuid" INTO NEW."columnUuid" FROM "BoardColumn" WHERE "id" = NEW."columnId";
IF NOT FOUND THEN RAISE EXCEPTION 'BoardColumn % 不存在', NEW."columnId"; END IF;
IF NEW."parentId" IS NULL THEN
NEW."parentUuid" := NULL;
ELSE
SELECT "uuid" INTO NEW."parentUuid" FROM "Task" WHERE "id" = NEW."parentId";
IF NOT FOUND THEN RAISE EXCEPTION 'Task % 不存在', NEW."parentId"; END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "trg_task_uuid_map" BEFORE INSERT OR UPDATE ON "Task"
FOR EACH ROW EXECUTE FUNCTION "func_task_uuid_map"();
CREATE OR REPLACE FUNCTION "func_taskmember_uuid_map"() RETURNS TRIGGER AS $$
BEGIN
SELECT "uuid" INTO NEW."taskUuid" FROM "Task" WHERE "id" = NEW."taskId";
IF NOT FOUND THEN RAISE EXCEPTION 'Task % 不存在', NEW."taskId"; END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "trg_taskmember_uuid_map" BEFORE INSERT OR UPDATE ON "TaskMember"
FOR EACH ROW EXECUTE FUNCTION "func_taskmember_uuid_map"();
CREATE OR REPLACE FUNCTION "func_tasktag_uuid_map"() RETURNS TRIGGER AS $$
BEGIN
SELECT "uuid" INTO NEW."taskUuid" FROM "Task" WHERE "id" = NEW."taskId";
IF NOT FOUND THEN RAISE EXCEPTION 'Task % 不存在', NEW."taskId"; END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "trg_tasktag_uuid_map" BEFORE INSERT OR UPDATE ON "TaskTag"
FOR EACH ROW EXECUTE FUNCTION "func_tasktag_uuid_map"();
+1 -1
View File
@@ -1,3 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "mysql"
provider = "postgresql"