refactor: 数据库迁移 - agents 表替代 agent_configs + 知识库 slug→kb_id
- manager.py 新增 agents 表创建及索引 - 移除旧的 agent_configs 迁移(uid、department_id 等) - 知识库相关表(evaluation、graph、chunks)参照字段 slug→kb_id
This commit is contained in:
parent
a35fd85353
commit
fbb5b458ea
@ -168,7 +168,7 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
CREATE TABLE IF NOT EXISTS evaluation_datasets (
|
CREATE TABLE IF NOT EXISTS evaluation_datasets (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
dataset_id VARCHAR(64) NOT NULL UNIQUE,
|
dataset_id VARCHAR(64) NOT NULL UNIQUE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
name VARCHAR(255) NOT NULL,
|
name VARCHAR(255) NOT NULL,
|
||||||
description TEXT,
|
description TEXT,
|
||||||
item_count INTEGER DEFAULT 0,
|
item_count INTEGER DEFAULT 0,
|
||||||
@ -185,7 +185,7 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
item_id VARCHAR(64) NOT NULL UNIQUE,
|
item_id VARCHAR(64) NOT NULL UNIQUE,
|
||||||
dataset_id VARCHAR(64) NOT NULL REFERENCES evaluation_datasets(dataset_id) ON DELETE CASCADE,
|
dataset_id VARCHAR(64) NOT NULL REFERENCES evaluation_datasets(dataset_id) ON DELETE CASCADE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
item_index INTEGER NOT NULL,
|
item_index INTEGER NOT NULL,
|
||||||
query_text TEXT NOT NULL,
|
query_text TEXT NOT NULL,
|
||||||
gold_chunk_ids JSONB,
|
gold_chunk_ids JSONB,
|
||||||
@ -198,7 +198,7 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
CREATE TABLE IF NOT EXISTS evaluation_runs (
|
CREATE TABLE IF NOT EXISTS evaluation_runs (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
run_id VARCHAR(64) NOT NULL UNIQUE,
|
run_id VARCHAR(64) NOT NULL UNIQUE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
dataset_id VARCHAR(64) REFERENCES evaluation_datasets(dataset_id) ON DELETE SET NULL,
|
dataset_id VARCHAR(64) REFERENCES evaluation_datasets(dataset_id) ON DELETE SET NULL,
|
||||||
status VARCHAR(32) DEFAULT 'running',
|
status VARCHAR(32) DEFAULT 'running',
|
||||||
retrieval_config JSONB,
|
retrieval_config JSONB,
|
||||||
@ -232,7 +232,7 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
chunk_id VARCHAR(128) NOT NULL UNIQUE,
|
chunk_id VARCHAR(128) NOT NULL UNIQUE,
|
||||||
file_id VARCHAR(64) NOT NULL REFERENCES knowledge_files(file_id) ON DELETE CASCADE,
|
file_id VARCHAR(64) NOT NULL REFERENCES knowledge_files(file_id) ON DELETE CASCADE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
chunk_index INTEGER NOT NULL,
|
chunk_index INTEGER NOT NULL,
|
||||||
content TEXT NOT NULL,
|
content TEXT NOT NULL,
|
||||||
start_char_pos INTEGER,
|
start_char_pos INTEGER,
|
||||||
@ -252,21 +252,21 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
CREATE TABLE IF NOT EXISTS knowledge_graph_entities (
|
CREATE TABLE IF NOT EXISTS knowledge_graph_entities (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
entity_id VARCHAR(64) NOT NULL UNIQUE,
|
entity_id VARCHAR(64) NOT NULL UNIQUE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
normalized_name VARCHAR(512) NOT NULL,
|
normalized_name VARCHAR(512) NOT NULL,
|
||||||
label VARCHAR(128) NOT NULL,
|
label VARCHAR(128) NOT NULL,
|
||||||
name VARCHAR(512) NOT NULL,
|
name VARCHAR(512) NOT NULL,
|
||||||
attributes JSONB,
|
attributes JSONB,
|
||||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
CONSTRAINT uq_knowledge_graph_entities_identity UNIQUE (slug, normalized_name, label)
|
CONSTRAINT uq_knowledge_graph_entities_identity UNIQUE (kb_id, normalized_name, label)
|
||||||
)
|
)
|
||||||
""",
|
""",
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS knowledge_graph_entity_mentions (
|
CREATE TABLE IF NOT EXISTS knowledge_graph_entity_mentions (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
entity_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_entities(entity_id) ON DELETE CASCADE,
|
entity_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_entities(entity_id) ON DELETE CASCADE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
file_id VARCHAR(64) NOT NULL REFERENCES knowledge_files(file_id) ON DELETE CASCADE,
|
file_id VARCHAR(64) NOT NULL REFERENCES knowledge_files(file_id) ON DELETE CASCADE,
|
||||||
chunk_id VARCHAR(128) NOT NULL REFERENCES knowledge_chunks(chunk_id) ON DELETE CASCADE,
|
chunk_id VARCHAR(128) NOT NULL REFERENCES knowledge_chunks(chunk_id) ON DELETE CASCADE,
|
||||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
@ -277,7 +277,7 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
CREATE TABLE IF NOT EXISTS knowledge_graph_triples (
|
CREATE TABLE IF NOT EXISTS knowledge_graph_triples (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
triple_id VARCHAR(64) NOT NULL UNIQUE,
|
triple_id VARCHAR(64) NOT NULL UNIQUE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
source_entity_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_entities(entity_id) ON DELETE CASCADE,
|
source_entity_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_entities(entity_id) ON DELETE CASCADE,
|
||||||
target_entity_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_entities(entity_id) ON DELETE CASCADE,
|
target_entity_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_entities(entity_id) ON DELETE CASCADE,
|
||||||
relation_type VARCHAR(256) NOT NULL,
|
relation_type VARCHAR(256) NOT NULL,
|
||||||
@ -290,7 +290,7 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
CREATE TABLE IF NOT EXISTS knowledge_graph_triple_mentions (
|
CREATE TABLE IF NOT EXISTS knowledge_graph_triple_mentions (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
triple_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_triples(triple_id) ON DELETE CASCADE,
|
triple_id VARCHAR(64) NOT NULL REFERENCES knowledge_graph_triples(triple_id) ON DELETE CASCADE,
|
||||||
slug VARCHAR(80) NOT NULL REFERENCES knowledge_bases(slug) ON DELETE CASCADE,
|
kb_id VARCHAR(80) NOT NULL REFERENCES knowledge_bases(kb_id) ON DELETE CASCADE,
|
||||||
file_id VARCHAR(64) NOT NULL REFERENCES knowledge_files(file_id) ON DELETE CASCADE,
|
file_id VARCHAR(64) NOT NULL REFERENCES knowledge_files(file_id) ON DELETE CASCADE,
|
||||||
chunk_id VARCHAR(128) NOT NULL REFERENCES knowledge_chunks(chunk_id) ON DELETE CASCADE,
|
chunk_id VARCHAR(128) NOT NULL REFERENCES knowledge_chunks(chunk_id) ON DELETE CASCADE,
|
||||||
text TEXT,
|
text TEXT,
|
||||||
@ -299,40 +299,39 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
CONSTRAINT uq_knowledge_graph_triple_mentions_triple_chunk UNIQUE (triple_id, chunk_id)
|
CONSTRAINT uq_knowledge_graph_triple_mentions_triple_chunk UNIQUE (triple_id, chunk_id)
|
||||||
)
|
)
|
||||||
""",
|
""",
|
||||||
# 扩展 slug 字段长度以支持最长 75 字符的 ID(kb_private_ + 64字符hash)
|
"ALTER TABLE IF EXISTS knowledge_bases ALTER COLUMN kb_id TYPE VARCHAR(80)",
|
||||||
"ALTER TABLE IF EXISTS knowledge_bases ALTER COLUMN slug TYPE VARCHAR(80)",
|
"ALTER TABLE IF EXISTS knowledge_files ALTER COLUMN kb_id TYPE VARCHAR(80)",
|
||||||
"ALTER TABLE IF EXISTS knowledge_files ALTER COLUMN slug TYPE VARCHAR(80)",
|
"ALTER TABLE IF EXISTS evaluation_datasets ALTER COLUMN kb_id TYPE VARCHAR(80)",
|
||||||
"ALTER TABLE IF EXISTS evaluation_datasets ALTER COLUMN slug TYPE VARCHAR(80)",
|
"ALTER TABLE IF EXISTS evaluation_dataset_items ALTER COLUMN kb_id TYPE VARCHAR(80)",
|
||||||
"ALTER TABLE IF EXISTS evaluation_dataset_items ALTER COLUMN slug TYPE VARCHAR(80)",
|
"ALTER TABLE IF EXISTS evaluation_runs ALTER COLUMN kb_id TYPE VARCHAR(80)",
|
||||||
"ALTER TABLE IF EXISTS evaluation_runs ALTER COLUMN slug TYPE VARCHAR(80)",
|
|
||||||
"CREATE INDEX IF NOT EXISTS idx_kb_type ON knowledge_bases(kb_type)",
|
"CREATE INDEX IF NOT EXISTS idx_kb_type ON knowledge_bases(kb_type)",
|
||||||
"CREATE INDEX IF NOT EXISTS idx_kb_name ON knowledge_bases(name)",
|
"CREATE INDEX IF NOT EXISTS idx_kb_name ON knowledge_bases(name)",
|
||||||
"CREATE INDEX IF NOT EXISTS idx_kf_slug ON knowledge_files(slug)",
|
"CREATE INDEX IF NOT EXISTS idx_kf_kb_id ON knowledge_files(kb_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS idx_kf_parent ON knowledge_files(parent_id)",
|
"CREATE INDEX IF NOT EXISTS idx_kf_parent ON knowledge_files(parent_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS idx_kf_status ON knowledge_files(status)",
|
"CREATE INDEX IF NOT EXISTS idx_kf_status ON knowledge_files(status)",
|
||||||
"CREATE INDEX IF NOT EXISTS idx_kf_hash ON knowledge_files(content_hash)",
|
"CREATE INDEX IF NOT EXISTS idx_kf_hash ON knowledge_files(content_hash)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_datasets_slug ON evaluation_datasets(slug)",
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_datasets_kb_id ON evaluation_datasets(kb_id)",
|
||||||
(
|
(
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_dataset_items_dataset_index "
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_dataset_items_dataset_index "
|
||||||
"ON evaluation_dataset_items(dataset_id, item_index)"
|
"ON evaluation_dataset_items(dataset_id, item_index)"
|
||||||
),
|
),
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_dataset_items_slug ON evaluation_dataset_items(slug)",
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_dataset_items_kb_id ON evaluation_dataset_items(kb_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_runs_slug ON evaluation_runs(slug)",
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_runs_kb_id ON evaluation_runs(kb_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_runs_status ON evaluation_runs(status)",
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_runs_status ON evaluation_runs(status)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_runs_started ON evaluation_runs(started_at DESC)",
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_runs_started ON evaluation_runs(started_at DESC)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_evaluation_run_items_run_index ON evaluation_run_items(run_id, item_index)",
|
"CREATE INDEX IF NOT EXISTS ix_evaluation_run_items_run_index ON evaluation_run_items(run_id, item_index)",
|
||||||
"CREATE UNIQUE INDEX IF NOT EXISTS uq_knowledge_chunks_chunk_id ON knowledge_chunks(chunk_id)",
|
"CREATE UNIQUE INDEX IF NOT EXISTS uq_knowledge_chunks_chunk_id ON knowledge_chunks(chunk_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_chunks_file_id ON knowledge_chunks(file_id)",
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_chunks_file_id ON knowledge_chunks(file_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_chunks_slug ON knowledge_chunks(slug)",
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_chunks_kb_id ON knowledge_chunks(kb_id)",
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_chunks_graph_indexed ON knowledge_chunks(graph_indexed)",
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_chunks_graph_indexed ON knowledge_chunks(graph_indexed)",
|
||||||
(
|
(
|
||||||
"CREATE UNIQUE INDEX IF NOT EXISTS uq_knowledge_graph_entities_entity_id "
|
"CREATE UNIQUE INDEX IF NOT EXISTS uq_knowledge_graph_entities_entity_id "
|
||||||
"ON knowledge_graph_entities(entity_id)"
|
"ON knowledge_graph_entities(entity_id)"
|
||||||
),
|
),
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_entities_slug ON knowledge_graph_entities(slug)",
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_entities_kb_id ON knowledge_graph_entities(kb_id)",
|
||||||
(
|
(
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_entity_mentions_slug "
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_entity_mentions_kb_id "
|
||||||
"ON knowledge_graph_entity_mentions(slug)"
|
"ON knowledge_graph_entity_mentions(kb_id)"
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_entity_mentions_file_id "
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_entity_mentions_file_id "
|
||||||
@ -346,10 +345,10 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
"CREATE UNIQUE INDEX IF NOT EXISTS uq_knowledge_graph_triples_triple_id "
|
"CREATE UNIQUE INDEX IF NOT EXISTS uq_knowledge_graph_triples_triple_id "
|
||||||
"ON knowledge_graph_triples(triple_id)"
|
"ON knowledge_graph_triples(triple_id)"
|
||||||
),
|
),
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_triples_slug ON knowledge_graph_triples(slug)",
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_triples_kb_id ON knowledge_graph_triples(kb_id)",
|
||||||
(
|
(
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_triple_mentions_slug "
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_triple_mentions_kb_id "
|
||||||
"ON knowledge_graph_triple_mentions(slug)"
|
"ON knowledge_graph_triple_mentions(kb_id)"
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_triple_mentions_file_id "
|
"CREATE INDEX IF NOT EXISTS ix_knowledge_graph_triple_mentions_file_id "
|
||||||
@ -389,102 +388,31 @@ class PostgresManager(metaclass=SingletonMeta):
|
|||||||
)
|
)
|
||||||
""",
|
""",
|
||||||
"""
|
"""
|
||||||
ALTER TABLE IF EXISTS agent_configs
|
CREATE TABLE IF NOT EXISTS agents (
|
||||||
ADD COLUMN IF NOT EXISTS uid VARCHAR
|
id SERIAL PRIMARY KEY,
|
||||||
""",
|
slug VARCHAR(80) NOT NULL UNIQUE,
|
||||||
"""
|
backend_id VARCHAR(64) NOT NULL,
|
||||||
UPDATE agent_configs ac
|
name VARCHAR(100) NOT NULL,
|
||||||
SET uid = u.uid
|
description TEXT,
|
||||||
FROM users u
|
icon VARCHAR(255),
|
||||||
WHERE ac.uid IS NULL
|
pics JSONB NOT NULL DEFAULT '[]'::jsonb,
|
||||||
AND ac.created_by ~ '^[0-9]+$'
|
config_json JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||||
AND u.id = ac.created_by::integer
|
share_config JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||||
""",
|
is_default BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
"""
|
created_by VARCHAR(64),
|
||||||
UPDATE agent_configs ac
|
updated_by VARCHAR(64),
|
||||||
SET uid = u.uid
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
FROM users u
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
WHERE ac.uid IS NULL
|
|
||||||
AND ac.created_by = u.uid
|
|
||||||
""",
|
|
||||||
"""
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (
|
|
||||||
SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'agent_configs' AND column_name = 'department_id'
|
|
||||||
) THEN
|
|
||||||
EXECUTE $sql$
|
|
||||||
UPDATE agent_configs ac
|
|
||||||
SET uid = (
|
|
||||||
SELECT u.uid
|
|
||||||
FROM users u
|
|
||||||
WHERE u.department_id = ac.department_id
|
|
||||||
AND u.is_deleted = 0
|
|
||||||
ORDER BY
|
|
||||||
CASE WHEN u.role = 'superadmin' THEN 0 WHEN u.role = 'admin' THEN 1 ELSE 2 END,
|
|
||||||
u.id ASC
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
WHERE ac.uid IS NULL
|
|
||||||
$sql$;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
""",
|
|
||||||
"DELETE FROM agent_configs WHERE uid IS NULL",
|
|
||||||
"DROP INDEX IF EXISTS uq_agent_configs_department_agent_default",
|
|
||||||
"DROP INDEX IF EXISTS ix_agent_configs_department_id",
|
|
||||||
"ALTER TABLE IF EXISTS agent_configs DROP CONSTRAINT IF EXISTS uq_agent_configs_department_agent_name",
|
|
||||||
"ALTER TABLE IF EXISTS agent_configs DROP CONSTRAINT IF EXISTS agent_configs_department_id_fkey",
|
|
||||||
"ALTER TABLE IF EXISTS agent_configs DROP COLUMN IF EXISTS department_id",
|
|
||||||
"ALTER TABLE IF EXISTS agent_configs ALTER COLUMN uid SET NOT NULL",
|
|
||||||
"""
|
|
||||||
WITH ranked AS (
|
|
||||||
SELECT id, ROW_NUMBER() OVER (PARTITION BY uid, agent_id, name ORDER BY id) AS rn
|
|
||||||
FROM agent_configs
|
|
||||||
)
|
)
|
||||||
UPDATE agent_configs ac
|
|
||||||
SET name = LEFT(ac.name, 90) || '-' || ac.id::text
|
|
||||||
FROM ranked
|
|
||||||
WHERE ac.id = ranked.id AND ranked.rn > 1
|
|
||||||
""",
|
""",
|
||||||
|
"ALTER TABLE IF EXISTS agents ADD COLUMN IF NOT EXISTS backend_id VARCHAR(64)",
|
||||||
|
"ALTER TABLE IF EXISTS agents ADD COLUMN IF NOT EXISTS share_config JSONB NOT NULL DEFAULT '{}'::jsonb",
|
||||||
|
"CREATE UNIQUE INDEX IF NOT EXISTS ix_agents_slug ON agents(slug)",
|
||||||
|
"CREATE INDEX IF NOT EXISTS ix_agents_backend_id ON agents(backend_id)",
|
||||||
|
"CREATE INDEX IF NOT EXISTS ix_agents_created_by ON agents(created_by)",
|
||||||
"""
|
"""
|
||||||
WITH ranked AS (
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_agents_default
|
||||||
SELECT id, ROW_NUMBER() OVER (PARTITION BY uid, agent_id ORDER BY id) AS rn
|
ON agents(is_default)
|
||||||
FROM agent_configs
|
|
||||||
WHERE is_default IS TRUE
|
|
||||||
)
|
|
||||||
UPDATE agent_configs ac
|
|
||||||
SET is_default = FALSE
|
|
||||||
FROM ranked
|
|
||||||
WHERE ac.id = ranked.id AND ranked.rn > 1
|
|
||||||
""",
|
|
||||||
"""
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF NOT EXISTS (
|
|
||||||
SELECT 1 FROM pg_constraint WHERE conname = 'agent_configs_uid_fkey'
|
|
||||||
) THEN
|
|
||||||
ALTER TABLE agent_configs
|
|
||||||
ADD CONSTRAINT agent_configs_uid_fkey FOREIGN KEY (uid) REFERENCES users(uid);
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
""",
|
|
||||||
"""
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF NOT EXISTS (
|
|
||||||
SELECT 1 FROM pg_constraint WHERE conname = 'uq_agent_configs_uid_agent_name'
|
|
||||||
) THEN
|
|
||||||
ALTER TABLE agent_configs
|
|
||||||
ADD CONSTRAINT uq_agent_configs_uid_agent_name UNIQUE (uid, agent_id, name);
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
""",
|
|
||||||
"CREATE INDEX IF NOT EXISTS ix_agent_configs_uid ON agent_configs(uid)",
|
|
||||||
"""
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_agent_configs_uid_agent_default
|
|
||||||
ON agent_configs(uid, agent_id)
|
|
||||||
WHERE is_default IS TRUE
|
WHERE is_default IS TRUE
|
||||||
""",
|
""",
|
||||||
"""
|
"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user