重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
flyway-migrations by ashchupliak/dream-team
npx skills add https://github.com/ashchupliak/dream-team --skill flyway-migrationsV{version}__{description}.sql
示例:
V001__create_environment_table.sql
V002__add_status_column.sql
V003__create_index_on_name.sql
V010__add_labels_jsonb.sql
V011__data_migration_normalize_status.sql
规则:
-- V001__create_environment_table.sql
CREATE TABLE environment (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
description TEXT,
status VARCHAR(50) NOT NULL DEFAULT 'PENDING',
owner_id UUID NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE,
CONSTRAINT uk_environment_name UNIQUE (name),
CONSTRAINT fk_environment_owner FOREIGN KEY (owner_id)
REFERENCES users(id) ON DELETE CASCADE
);
-- 索引
CREATE INDEX idx_environment_status ON environment(status);
CREATE INDEX idx_environment_owner_id ON environment(owner_id);
CREATE INDEX idx_environment_created_at ON environment(created_at DESC);
-- 注释
COMMENT ON TABLE environment IS 'Orca 开发环境';
COMMENT ON COLUMN environment.status IS 'PENDING, RUNNING, STOPPED, FAILED';
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
-- V002__add_labels_to_environment.sql
ALTER TABLE environment
ADD COLUMN labels JSONB NOT NULL DEFAULT '{}';
-- 为 JSONB 查询添加 GIN 索引
CREATE INDEX idx_environment_labels ON environment USING GIN (labels);
-- 如果经常查询特定键,则添加特定键索引
CREATE INDEX idx_environment_labels_team ON environment ((labels->>'team'));
-- V003__change_description_length.sql
-- 安全:增加长度
ALTER TABLE environment
ALTER COLUMN description TYPE VARCHAR(2000);
-- V004__make_description_not_null.sql
-- 第一步:为现有的空值设置默认值
UPDATE environment SET description = '' WHERE description IS NULL;
-- 然后:添加约束
ALTER TABLE environment
ALTER COLUMN description SET NOT NULL,
ALTER COLUMN description SET DEFAULT '';
-- V005__add_environment_type.sql
-- 选项 1:带有 CHECK 约束的 VARCHAR
ALTER TABLE environment
ADD COLUMN type VARCHAR(20) NOT NULL DEFAULT 'STANDARD'
CONSTRAINT chk_environment_type
CHECK (type IN ('STANDARD', 'PREMIUM', 'ENTERPRISE'));
-- 选项 2:PostgreSQL ENUM 类型
CREATE TYPE environment_type AS ENUM ('STANDARD', 'PREMIUM', 'ENTERPRISE');
ALTER TABLE environment ADD COLUMN type environment_type NOT NULL DEFAULT 'STANDARD';
-- V006__migrate_status_values.sql
-- 规范化状态值
UPDATE environment
SET status = CASE
WHEN status IN ('pending', 'Pending', 'PENDING') THEN 'PENDING'
WHEN status IN ('running', 'Running', 'RUNNING', 'active') THEN 'RUNNING'
WHEN status IN ('stopped', 'Stopped', 'STOPPED', 'inactive') THEN 'STOPPED'
WHEN status IN ('failed', 'Failed', 'FAILED', 'error') THEN 'FAILED'
ELSE 'PENDING'
END
WHERE status NOT IN ('PENDING', 'RUNNING', 'STOPPED', 'FAILED');
-- V007__create_environment_tag_table.sql
CREATE TABLE environment_tag (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
environment_id UUID NOT NULL,
key VARCHAR(100) NOT NULL,
value VARCHAR(500) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
CONSTRAINT fk_tag_environment FOREIGN KEY (environment_id)
REFERENCES environment(id) ON DELETE CASCADE,
CONSTRAINT uk_tag_env_key UNIQUE (environment_id, key)
);
CREATE INDEX idx_tag_environment_id ON environment_tag(environment_id);
CREATE INDEX idx_tag_key_value ON environment_tag(key, value);
-- V008__add_column_if_not_exists.sql
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'environment' AND column_name = 'region'
) THEN
ALTER TABLE environment ADD COLUMN region VARCHAR(50);
END IF;
END $$;
-- 如果不存在则创建索引
CREATE INDEX IF NOT EXISTS idx_environment_region ON environment(region);
-- 如果不存在则创建表
CREATE TABLE IF NOT EXISTS audit_log (
id BIGSERIAL PRIMARY KEY,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID NOT NULL,
action VARCHAR(20) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-- V009__remove_deprecated_column.sql
-- 步骤 1:首先删除任何默认值/约束
ALTER TABLE environment ALTER COLUMN legacy_field DROP DEFAULT;
ALTER TABLE environment DROP CONSTRAINT IF EXISTS chk_legacy_field;
-- 步骤 2:删除依赖的索引
DROP INDEX IF EXISTS idx_environment_legacy;
-- 步骤 3:删除列
ALTER TABLE environment DROP COLUMN IF EXISTS legacy_field;
-- V010__add_index_concurrently.sql
-- CONCURRENTLY 防止表锁定(要求无事务)
-- 添加到 flyway.conf: flyway.postgresql.transactional.lock=false
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_environment_name_lower
ON environment (LOWER(name));
-- 对于大数据更新,分批处理
-- V011__batch_update_large_table.sql
DO $$
DECLARE
batch_size INT := 10000;
affected INT;
BEGIN
LOOP
UPDATE environment
SET normalized_name = LOWER(TRIM(name))
WHERE normalized_name IS NULL
LIMIT batch_size;
GET DIAGNOSTICS affected = ROW_COUNT;
EXIT WHEN affected = 0;
COMMIT;
PERFORM pg_sleep(0.1); -- 短暂暂停以减轻负载
END LOOP;
END $$;
-- U010__undo_add_region.sql (Flyway Teams/Enterprise)
ALTER TABLE environment DROP COLUMN IF EXISTS region;
DROP INDEX IF EXISTS idx_environment_region;
// build.gradle.kts
plugins {
id("org.flywaydb.flyway") version "11.11.2"
}
flyway {
url = "jdbc:postgresql://localhost:5432/orca"
user = System.getenv("DB_USER") ?: "orca"
password = System.getenv("DB_PASSWORD") ?: "orca"
schemas = arrayOf("public")
locations = arrayOf("classpath:db/migration")
cleanDisabled = true // 防止在生产环境中意外清理
validateMigrationNaming = true
}
tasks.named("flywayMigrate") {
dependsOn("processResources")
}
每周安装量
50
代码仓库
GitHub 星标数
4
首次出现
2026年1月20日
安全审计
安装于
opencode41
codex40
gemini-cli40
github-copilot37
cursor32
amp30
V{version}__{description}.sql
Examples:
V001__create_environment_table.sql
V002__add_status_column.sql
V003__create_index_on_name.sql
V010__add_labels_jsonb.sql
V011__data_migration_normalize_status.sql
Rules:
-- V001__create_environment_table.sql
CREATE TABLE environment (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
description TEXT,
status VARCHAR(50) NOT NULL DEFAULT 'PENDING',
owner_id UUID NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE,
CONSTRAINT uk_environment_name UNIQUE (name),
CONSTRAINT fk_environment_owner FOREIGN KEY (owner_id)
REFERENCES users(id) ON DELETE CASCADE
);
-- Indexes
CREATE INDEX idx_environment_status ON environment(status);
CREATE INDEX idx_environment_owner_id ON environment(owner_id);
CREATE INDEX idx_environment_created_at ON environment(created_at DESC);
-- Comments
COMMENT ON TABLE environment IS 'Orca development environments';
COMMENT ON COLUMN environment.status IS 'PENDING, RUNNING, STOPPED, FAILED';
-- V002__add_labels_to_environment.sql
ALTER TABLE environment
ADD COLUMN labels JSONB NOT NULL DEFAULT '{}';
-- Add GIN index for JSONB queries
CREATE INDEX idx_environment_labels ON environment USING GIN (labels);
-- Add specific key index if frequently queried
CREATE INDEX idx_environment_labels_team ON environment ((labels->>'team'));
-- V003__change_description_length.sql
-- Safe: increasing length
ALTER TABLE environment
ALTER COLUMN description TYPE VARCHAR(2000);
-- V004__make_description_not_null.sql
-- First: set default for existing nulls
UPDATE environment SET description = '' WHERE description IS NULL;
-- Then: add constraint
ALTER TABLE environment
ALTER COLUMN description SET NOT NULL,
ALTER COLUMN description SET DEFAULT '';
-- V005__add_environment_type.sql
-- Option 1: VARCHAR with CHECK constraint
ALTER TABLE environment
ADD COLUMN type VARCHAR(20) NOT NULL DEFAULT 'STANDARD'
CONSTRAINT chk_environment_type
CHECK (type IN ('STANDARD', 'PREMIUM', 'ENTERPRISE'));
-- Option 2: PostgreSQL ENUM type
CREATE TYPE environment_type AS ENUM ('STANDARD', 'PREMIUM', 'ENTERPRISE');
ALTER TABLE environment ADD COLUMN type environment_type NOT NULL DEFAULT 'STANDARD';
-- V006__migrate_status_values.sql
-- Normalize status values
UPDATE environment
SET status = CASE
WHEN status IN ('pending', 'Pending', 'PENDING') THEN 'PENDING'
WHEN status IN ('running', 'Running', 'RUNNING', 'active') THEN 'RUNNING'
WHEN status IN ('stopped', 'Stopped', 'STOPPED', 'inactive') THEN 'STOPPED'
WHEN status IN ('failed', 'Failed', 'FAILED', 'error') THEN 'FAILED'
ELSE 'PENDING'
END
WHERE status NOT IN ('PENDING', 'RUNNING', 'STOPPED', 'FAILED');
-- V007__create_environment_tag_table.sql
CREATE TABLE environment_tag (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
environment_id UUID NOT NULL,
key VARCHAR(100) NOT NULL,
value VARCHAR(500) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
CONSTRAINT fk_tag_environment FOREIGN KEY (environment_id)
REFERENCES environment(id) ON DELETE CASCADE,
CONSTRAINT uk_tag_env_key UNIQUE (environment_id, key)
);
CREATE INDEX idx_tag_environment_id ON environment_tag(environment_id);
CREATE INDEX idx_tag_key_value ON environment_tag(key, value);
-- V008__add_column_if_not_exists.sql
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'environment' AND column_name = 'region'
) THEN
ALTER TABLE environment ADD COLUMN region VARCHAR(50);
END IF;
END $$;
-- Create index if not exists
CREATE INDEX IF NOT EXISTS idx_environment_region ON environment(region);
-- Create table if not exists
CREATE TABLE IF NOT EXISTS audit_log (
id BIGSERIAL PRIMARY KEY,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID NOT NULL,
action VARCHAR(20) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-- V009__remove_deprecated_column.sql
-- Step 1: Remove any defaults/constraints first
ALTER TABLE environment ALTER COLUMN legacy_field DROP DEFAULT;
ALTER TABLE environment DROP CONSTRAINT IF EXISTS chk_legacy_field;
-- Step 2: Drop dependent indexes
DROP INDEX IF EXISTS idx_environment_legacy;
-- Step 3: Drop the column
ALTER TABLE environment DROP COLUMN IF EXISTS legacy_field;
-- V010__add_index_concurrently.sql
-- CONCURRENTLY prevents table locks (requires no transaction)
-- Add to flyway.conf: flyway.postgresql.transactional.lock=false
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_environment_name_lower
ON environment (LOWER(name));
-- For large data updates, batch them
-- V011__batch_update_large_table.sql
DO $$
DECLARE
batch_size INT := 10000;
affected INT;
BEGIN
LOOP
UPDATE environment
SET normalized_name = LOWER(TRIM(name))
WHERE normalized_name IS NULL
LIMIT batch_size;
GET DIAGNOSTICS affected = ROW_COUNT;
EXIT WHEN affected = 0;
COMMIT;
PERFORM pg_sleep(0.1); -- Small pause to reduce load
END LOOP;
END $$;
-- U010__undo_add_region.sql (Flyway Teams/Enterprise)
ALTER TABLE environment DROP COLUMN IF EXISTS region;
DROP INDEX IF EXISTS idx_environment_region;
// build.gradle.kts
plugins {
id("org.flywaydb.flyway") version "11.11.2"
}
flyway {
url = "jdbc:postgresql://localhost:5432/orca"
user = System.getenv("DB_USER") ?: "orca"
password = System.getenv("DB_PASSWORD") ?: "orca"
schemas = arrayOf("public")
locations = arrayOf("classpath:db/migration")
cleanDisabled = true // Prevent accidental clean in production
validateMigrationNaming = true
}
tasks.named("flywayMigrate") {
dependsOn("processResources")
}
Weekly Installs
50
Repository
GitHub Stars
4
First Seen
Jan 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode41
codex40
gemini-cli40
github-copilot37
cursor32
amp30
Azure 升级评估与自动化工具 - 轻松迁移 Functions 计划、托管层级和 SKU
127,000 周安装
autonomous-loops 自主循环技能:Claude Code 自动化开发工作流架构指南
1,800 周安装
SwiftUI 开发模式指南:状态管理、视图组合与导航最佳实践
1,800 周安装
智能体工程指南:AI智能体开发工作流、模型路由与代码审查最佳实践
1,800 周安装
tmux 会话控制技能:自动化管理 Claude Code 会话与终端进程
1,900 周安装
NotebookLM Python库:自动化访问Google NotebookLM,实现AI内容创作与文档处理
2,000 周安装
Tailwind v4 + shadcn/ui 生产级技术栈配置指南:5分钟快速搭建,避免常见错误
2,200 周安装