refactor
This commit is contained in:
@@ -0,0 +1,365 @@
|
||||
from tortoise import BaseDBAsyncClient
|
||||
|
||||
RUN_IN_TRANSACTION = True
|
||||
|
||||
|
||||
async def upgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
-- Шаг 1: Переименовать старую таблицу placement в old_placement
|
||||
ALTER TABLE "placement" RENAME TO "old_placement";
|
||||
|
||||
-- Шаг 2: Создать новую таблицу placement (объединение purchase + purchase_channel)
|
||||
CREATE TABLE "placement" (
|
||||
"id" UUID NOT NULL PRIMARY KEY,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_at" TIMESTAMPTZ,
|
||||
"status" VARCHAR(11) NOT NULL DEFAULT 'planned',
|
||||
"placement_at" TIMESTAMPTZ,
|
||||
"payment_at" TIMESTAMPTZ,
|
||||
"cost_type" VARCHAR(8),
|
||||
"cost_value" DOUBLE PRECISION,
|
||||
"cost_before_bargain" DOUBLE PRECISION,
|
||||
"placement_type" VARCHAR(16),
|
||||
"format" TEXT,
|
||||
"comment" TEXT,
|
||||
"invite_link" VARCHAR(512) NOT NULL,
|
||||
"invite_link_type" VARCHAR(8) NOT NULL,
|
||||
"project_id" UUID NOT NULL REFERENCES "project" ("id") ON DELETE CASCADE,
|
||||
"creative_id" UUID NOT NULL REFERENCES "creative" ("id") ON DELETE CASCADE,
|
||||
"channel_id" UUID NOT NULL REFERENCES "channel" ("id") ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Шаг 3: Мигрировать данные из purchase_channel + purchase в новый placement
|
||||
INSERT INTO "placement" (
|
||||
"id", "created_at", "updated_at", "deleted_at",
|
||||
"status", "placement_at", "payment_at",
|
||||
"cost_type", "cost_value", "cost_before_bargain",
|
||||
"placement_type", "format", "comment",
|
||||
"invite_link", "invite_link_type",
|
||||
"project_id", "creative_id", "channel_id"
|
||||
)
|
||||
SELECT
|
||||
pc.id, pc.created_at, pc.updated_at, pc.deleted_at,
|
||||
pc.status,
|
||||
COALESCE(pc.placement_at, p.placement_at),
|
||||
p.payment_at,
|
||||
COALESCE(pc.cost_type, p.cost_type),
|
||||
COALESCE(pc.cost_value, p.cost_value),
|
||||
COALESCE(pc.cost_before_bargain, p.cost_before_bargain),
|
||||
p.purchase_type,
|
||||
COALESCE(pc.format, p.format),
|
||||
COALESCE(pc.comment, p.comment),
|
||||
pc.invite_link, pc.invite_link_type,
|
||||
p.project_id, p.creative_id, pc.channel_id
|
||||
FROM "purchase_channel" pc
|
||||
JOIN "purchase" p ON pc.purchase_id = p.id;
|
||||
|
||||
-- Шаг 4: Создать таблицу publication (бывший placement)
|
||||
CREATE TABLE "publication" (
|
||||
"id" UUID NOT NULL PRIMARY KEY,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_at" TIMESTAMPTZ,
|
||||
"wanted_placement_date" TIMESTAMPTZ NOT NULL,
|
||||
"cost" DOUBLE PRECISION,
|
||||
"comment" TEXT,
|
||||
"status" VARCHAR(8) NOT NULL DEFAULT 'active',
|
||||
"creative_id" UUID NOT NULL REFERENCES "creative" ("id") ON DELETE CASCADE,
|
||||
"placement_id" UUID NOT NULL REFERENCES "placement" ("id") ON DELETE CASCADE,
|
||||
"post_id" UUID REFERENCES "post" ("id") ON DELETE SET NULL,
|
||||
"project_id" UUID NOT NULL REFERENCES "project" ("id") ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Шаг 5: Мигрировать данные из old_placement в publication
|
||||
INSERT INTO "publication" (
|
||||
"id", "created_at", "updated_at", "deleted_at",
|
||||
"wanted_placement_date", "cost", "comment", "status",
|
||||
"creative_id", "placement_id", "post_id", "project_id"
|
||||
)
|
||||
SELECT
|
||||
op.id, op.created_at, op.updated_at, op.deleted_at,
|
||||
op.wanted_placement_date, op.cost, op.comment, op.status,
|
||||
op.creative_id, op.purchase_channel_id, op.post_id, op.project_id
|
||||
FROM "old_placement" op;
|
||||
|
||||
-- Шаг 6: Обновить subscription (placement_id -> publication_id)
|
||||
ALTER TABLE "subscription" RENAME COLUMN "placement_id" TO "publication_id";
|
||||
|
||||
-- Шаг 7: Создать индексы и constraints
|
||||
CREATE INDEX "idx_placement_project_4155ce"
|
||||
ON "placement" ("project_id", "status");
|
||||
CREATE INDEX "idx_placement_channel_fb3968"
|
||||
ON "placement" ("channel_id");
|
||||
CREATE INDEX "idx_publication_creativ_1c6807"
|
||||
ON "publication" ("creative_id");
|
||||
CREATE INDEX "idx_publication_placeme_bd5bc9"
|
||||
ON "publication" ("placement_id");
|
||||
CREATE INDEX "idx_publication_post_id_998755"
|
||||
ON "publication" ("post_id");
|
||||
CREATE INDEX "idx_publication_project_94129d"
|
||||
ON "publication" ("project_id");
|
||||
|
||||
ALTER TABLE "subscription"
|
||||
ADD CONSTRAINT "fk_subscrip_publicat_1959be9e"
|
||||
FOREIGN KEY ("publication_id")
|
||||
REFERENCES "publication" ("id") ON DELETE CASCADE;
|
||||
|
||||
CREATE UNIQUE INDEX "uid_subscriptio_publica_578bfb"
|
||||
ON "subscription" ("publication_id", "telegram_user_id");
|
||||
|
||||
-- Шаг 8: Добавить комментарии
|
||||
COMMENT ON TABLE "placement"
|
||||
IS 'Размещение, управляемое пользователем (бывший PurchaseChannel + Purchase)';
|
||||
COMMENT ON COLUMN "placement"."status"
|
||||
IS 'PLANNED: planned
|
||||
APPROVED: approved
|
||||
REJECTED: rejected
|
||||
IN_PROGRESS: in_progress
|
||||
COMPLETED: completed';
|
||||
COMMENT ON COLUMN "placement"."invite_link_type"
|
||||
IS 'PUBLIC: public
|
||||
APPROVAL: approval';
|
||||
COMMENT ON COLUMN "placement"."cost_type"
|
||||
IS 'FIXED: fixed
|
||||
CPM: cpm';
|
||||
COMMENT ON COLUMN "placement"."placement_type"
|
||||
IS 'SELF_PROMO: self_promo
|
||||
STANDARD: standard';
|
||||
|
||||
COMMENT ON TABLE "publication"
|
||||
IS 'Публикация, мониторимая системой (бывший Placement)';
|
||||
COMMENT ON COLUMN "publication"."status"
|
||||
IS 'ACTIVE: active
|
||||
ARCHIVED: archived';
|
||||
|
||||
-- Шаг 9: Удалить старые таблицы
|
||||
DROP TABLE IF EXISTS "old_placement";
|
||||
DROP TABLE IF EXISTS "purchase_channel";
|
||||
DROP TABLE IF EXISTS "purchase";
|
||||
"""
|
||||
|
||||
|
||||
async def downgrade(db: BaseDBAsyncClient) -> str:
|
||||
return """
|
||||
-- ВНИМАНИЕ: Downgrade может привести к потере данных при объединении placement обратно
|
||||
-- в purchase + purchase_channel (если были созданы placement без привязки к одному purchase)
|
||||
|
||||
-- Шаг 1: Переименовать новую таблицу placement в new_placement
|
||||
ALTER TABLE "placement" RENAME TO "new_placement";
|
||||
|
||||
-- Шаг 2: Воссоздать таблицу purchase
|
||||
CREATE TABLE "purchase" (
|
||||
"id" UUID NOT NULL PRIMARY KEY,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_at" TIMESTAMPTZ,
|
||||
"status" VARCHAR(8) NOT NULL DEFAULT 'active',
|
||||
"placement_at" TIMESTAMPTZ,
|
||||
"payment_at" TIMESTAMPTZ,
|
||||
"cost_type" VARCHAR(8),
|
||||
"cost_value" DOUBLE PRECISION,
|
||||
"cost_before_bargain" DOUBLE PRECISION,
|
||||
"purchase_type" VARCHAR(16),
|
||||
"format" TEXT,
|
||||
"comment" TEXT,
|
||||
"project_id" UUID NOT NULL REFERENCES "project" ("id") ON DELETE CASCADE,
|
||||
"creative_id" UUID NOT NULL REFERENCES "creative" ("id") ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Шаг 3: Воссоздать таблицу purchase_channel
|
||||
CREATE TABLE "purchase_channel" (
|
||||
"id" UUID NOT NULL PRIMARY KEY,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_at" TIMESTAMPTZ,
|
||||
"status" VARCHAR(11) NOT NULL DEFAULT 'planned',
|
||||
"placement_at" TIMESTAMPTZ,
|
||||
"cost_type" VARCHAR(8),
|
||||
"cost_value" DOUBLE PRECISION,
|
||||
"cost_before_bargain" DOUBLE PRECISION,
|
||||
"format" TEXT,
|
||||
"comment" TEXT,
|
||||
"invite_link" VARCHAR(512) NOT NULL,
|
||||
"invite_link_type" VARCHAR(8) NOT NULL,
|
||||
"purchase_id" UUID NOT NULL REFERENCES "purchase" ("id") ON DELETE CASCADE,
|
||||
"channel_id" UUID NOT NULL REFERENCES "channel" ("id") ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Шаг 4: Мигрировать данные из new_placement в purchase (сгруппировать)
|
||||
-- Создаем purchase для каждого уникального project_id + creative_id
|
||||
INSERT INTO "purchase" (
|
||||
"id", "created_at", "updated_at", "deleted_at",
|
||||
"status", "placement_at", "payment_at",
|
||||
"cost_type", "cost_value", "cost_before_bargain",
|
||||
"purchase_type", "format", "comment",
|
||||
"project_id", "creative_id"
|
||||
)
|
||||
SELECT
|
||||
gen_random_uuid(),
|
||||
MIN(np.created_at),
|
||||
MAX(np.updated_at),
|
||||
NULL,
|
||||
'active',
|
||||
MIN(np.placement_at),
|
||||
MIN(np.payment_at),
|
||||
MIN(np.cost_type),
|
||||
MIN(np.cost_value),
|
||||
MIN(np.cost_before_bargain),
|
||||
MIN(np.placement_type),
|
||||
MIN(np.format),
|
||||
MIN(np.comment),
|
||||
np.project_id,
|
||||
np.creative_id
|
||||
FROM "new_placement" np
|
||||
GROUP BY np.project_id, np.creative_id;
|
||||
|
||||
-- Шаг 5: Мигрировать данные из new_placement в purchase_channel
|
||||
INSERT INTO "purchase_channel" (
|
||||
"id", "created_at", "updated_at", "deleted_at",
|
||||
"status", "placement_at", "cost_type", "cost_value",
|
||||
"cost_before_bargain", "format", "comment",
|
||||
"invite_link", "invite_link_type",
|
||||
"purchase_id", "channel_id"
|
||||
)
|
||||
SELECT
|
||||
np.id, np.created_at, np.updated_at, np.deleted_at,
|
||||
np.status, np.placement_at, np.cost_type, np.cost_value,
|
||||
np.cost_before_bargain, np.format, np.comment,
|
||||
np.invite_link, np.invite_link_type,
|
||||
p.id, np.channel_id
|
||||
FROM "new_placement" np
|
||||
JOIN "purchase" p
|
||||
ON p.project_id = np.project_id
|
||||
AND p.creative_id = np.creative_id;
|
||||
|
||||
-- Шаг 6: Воссоздать старую таблицу placement
|
||||
CREATE TABLE "placement" (
|
||||
"id" UUID NOT NULL PRIMARY KEY,
|
||||
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_at" TIMESTAMPTZ,
|
||||
"wanted_placement_date" TIMESTAMPTZ NOT NULL,
|
||||
"cost" DOUBLE PRECISION,
|
||||
"comment" TEXT,
|
||||
"status" VARCHAR(8) NOT NULL DEFAULT 'active',
|
||||
"creative_id" UUID NOT NULL REFERENCES "creative" ("id") ON DELETE CASCADE,
|
||||
"purchase_channel_id" UUID NOT NULL
|
||||
REFERENCES "purchase_channel" ("id") ON DELETE CASCADE,
|
||||
"post_id" UUID REFERENCES "post" ("id") ON DELETE SET NULL,
|
||||
"project_id" UUID NOT NULL REFERENCES "project" ("id") ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Шаг 7: Мигрировать данные из publication в placement
|
||||
INSERT INTO "placement" (
|
||||
"id", "created_at", "updated_at", "deleted_at",
|
||||
"wanted_placement_date", "cost", "comment", "status",
|
||||
"creative_id", "purchase_channel_id", "post_id", "project_id"
|
||||
)
|
||||
SELECT
|
||||
pub.id, pub.created_at, pub.updated_at, pub.deleted_at,
|
||||
pub.wanted_placement_date, pub.cost, pub.comment, pub.status,
|
||||
pub.creative_id, pub.placement_id, pub.post_id, pub.project_id
|
||||
FROM "publication" pub;
|
||||
|
||||
-- Шаг 8: Обновить subscription (publication_id -> placement_id)
|
||||
ALTER TABLE "subscription" RENAME COLUMN "publication_id" TO "placement_id";
|
||||
|
||||
-- Шаг 9: Создать индексы
|
||||
CREATE INDEX "idx_purchase_project_status" ON "purchase" ("project_id", "status");
|
||||
CREATE INDEX "idx_placement_purchas_61f9e6"
|
||||
ON "placement" ("purchase_channel_id");
|
||||
CREATE INDEX "idx_placement_post_id_e4a16e" ON "placement" ("post_id");
|
||||
|
||||
ALTER TABLE "subscription"
|
||||
ADD CONSTRAINT "fk_subscrip_placemen_0b5d8f15"
|
||||
FOREIGN KEY ("placement_id")
|
||||
REFERENCES "placement" ("id") ON DELETE CASCADE;
|
||||
|
||||
CREATE UNIQUE INDEX "uid_subscriptio_placeme_75b40b"
|
||||
ON "subscription" ("placement_id", "telegram_user_id");
|
||||
|
||||
-- Шаг 10: Удалить новые таблицы
|
||||
DROP TABLE IF EXISTS "publication";
|
||||
DROP TABLE IF EXISTS "new_placement";
|
||||
"""
|
||||
|
||||
|
||||
MODELS_STATE = (
|
||||
"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"
|
||||
"OfXn7/A5u7TFM="
|
||||
)
|
||||
Reference in New Issue
Block a user