267 lines
8.2 KiB
Python
267 lines
8.2 KiB
Python
"""Add surrogate int IDs for transport catalogs and invoice logistics.
|
|
|
|
Single consolidated migration for:
|
|
- transporter_id, trailer_id, vehicle_id, driver_id
|
|
- carrier_int_id, transport_int_id, trailer_int_id in invoice_logistics
|
|
- backfill mappings from existing string keys/codes
|
|
- FK constraints for the new invoice_logistics int references
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
revision: str = "ca7d3c4e8b2a"
|
|
down_revision: Union[str, Sequence[str], None] = "c1a2b3d4e5f6"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# transporter
|
|
op.add_column("transporter", sa.Column("transporter_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
op.execute(
|
|
"""
|
|
WITH s AS (
|
|
SELECT transporter_key, ROW_NUMBER() OVER (ORDER BY transporter_key) AS new_id
|
|
FROM a76.transporter
|
|
)
|
|
UPDATE a76.transporter t
|
|
SET transporter_id = s.new_id
|
|
FROM s
|
|
WHERE t.transporter_key = s.transporter_key
|
|
"""
|
|
)
|
|
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.transporter_transporter_id_seq")
|
|
op.execute(
|
|
"""
|
|
SELECT setval(
|
|
'a76.transporter_transporter_id_seq',
|
|
COALESCE((SELECT MAX(transporter_id) FROM a76.transporter), 0) + 1,
|
|
false
|
|
)
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
ALTER TABLE a76.transporter
|
|
ALTER COLUMN transporter_id
|
|
SET DEFAULT nextval('a76.transporter_transporter_id_seq')
|
|
"""
|
|
)
|
|
op.execute("ALTER TABLE a76.transporter ALTER COLUMN transporter_id SET NOT NULL")
|
|
op.create_unique_constraint("uq_a76_transporter_transporter_id", "transporter", ["transporter_id"], schema="a76")
|
|
|
|
# trailer
|
|
op.add_column("trailer", sa.Column("trailer_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
op.execute(
|
|
"""
|
|
WITH s AS (
|
|
SELECT trailer_number, ROW_NUMBER() OVER (ORDER BY trailer_number) AS new_id
|
|
FROM a76.trailer
|
|
)
|
|
UPDATE a76.trailer t
|
|
SET trailer_id = s.new_id
|
|
FROM s
|
|
WHERE t.trailer_number = s.trailer_number
|
|
"""
|
|
)
|
|
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.trailer_trailer_id_seq")
|
|
op.execute(
|
|
"""
|
|
SELECT setval(
|
|
'a76.trailer_trailer_id_seq',
|
|
COALESCE((SELECT MAX(trailer_id) FROM a76.trailer), 0) + 1,
|
|
false
|
|
)
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
ALTER TABLE a76.trailer
|
|
ALTER COLUMN trailer_id
|
|
SET DEFAULT nextval('a76.trailer_trailer_id_seq')
|
|
"""
|
|
)
|
|
op.execute("ALTER TABLE a76.trailer ALTER COLUMN trailer_id SET NOT NULL")
|
|
op.create_unique_constraint("uq_a76_trailer_trailer_id", "trailer", ["trailer_id"], schema="a76")
|
|
|
|
# vehicle
|
|
op.add_column("vehicle", sa.Column("vehicle_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
op.execute(
|
|
"""
|
|
WITH s AS (
|
|
SELECT vehicle_key, ROW_NUMBER() OVER (ORDER BY vehicle_key) AS new_id
|
|
FROM a76.vehicle
|
|
)
|
|
UPDATE a76.vehicle v
|
|
SET vehicle_id = s.new_id
|
|
FROM s
|
|
WHERE v.vehicle_key = s.vehicle_key
|
|
"""
|
|
)
|
|
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.vehicle_vehicle_id_seq")
|
|
op.execute(
|
|
"""
|
|
SELECT setval(
|
|
'a76.vehicle_vehicle_id_seq',
|
|
COALESCE((SELECT MAX(vehicle_id) FROM a76.vehicle), 0) + 1,
|
|
false
|
|
)
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
ALTER TABLE a76.vehicle
|
|
ALTER COLUMN vehicle_id
|
|
SET DEFAULT nextval('a76.vehicle_vehicle_id_seq')
|
|
"""
|
|
)
|
|
op.execute("ALTER TABLE a76.vehicle ALTER COLUMN vehicle_id SET NOT NULL")
|
|
op.create_unique_constraint("uq_a76_vehicle_vehicle_id", "vehicle", ["vehicle_id"], schema="a76")
|
|
|
|
# driver
|
|
op.add_column("driver", sa.Column("driver_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
op.execute(
|
|
"""
|
|
WITH s AS (
|
|
SELECT transporter_key, line, ROW_NUMBER() OVER (ORDER BY transporter_key, line) AS new_id
|
|
FROM a76.driver
|
|
)
|
|
UPDATE a76.driver d
|
|
SET driver_id = s.new_id
|
|
FROM s
|
|
WHERE d.transporter_key = s.transporter_key
|
|
AND d.line = s.line
|
|
"""
|
|
)
|
|
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.driver_driver_id_seq")
|
|
op.execute(
|
|
"""
|
|
SELECT setval(
|
|
'a76.driver_driver_id_seq',
|
|
COALESCE((SELECT MAX(driver_id) FROM a76.driver), 0) + 1,
|
|
false
|
|
)
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
ALTER TABLE a76.driver
|
|
ALTER COLUMN driver_id
|
|
SET DEFAULT nextval('a76.driver_driver_id_seq')
|
|
"""
|
|
)
|
|
op.execute("ALTER TABLE a76.driver ALTER COLUMN driver_id SET NOT NULL")
|
|
op.create_unique_constraint("uq_a76_driver_driver_id", "driver", ["driver_id"], schema="a76")
|
|
|
|
# invoice_logistics int refs
|
|
op.add_column("invoice_logistics", sa.Column("carrier_int_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
op.add_column("invoice_logistics", sa.Column("transport_int_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
op.add_column("invoice_logistics", sa.Column("trailer_int_id", sa.BigInteger(), nullable=True), schema="a76")
|
|
|
|
# ensure referenced codes exist
|
|
op.execute(
|
|
"""
|
|
INSERT INTO a76.transporter (transporter_key, tenant_id, company_id)
|
|
SELECT DISTINCT ON (il.carrier_id) il.carrier_id, il.tenant_id, il.company_id
|
|
FROM a76.invoice_logistics il
|
|
WHERE il.carrier_id IS NOT NULL
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM a76.transporter t WHERE t.transporter_key = il.carrier_id
|
|
)
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
INSERT INTO a76.vehicle (vehicle_key, tenant_id, company_id)
|
|
SELECT DISTINCT ON (il.transport_id) il.transport_id, il.tenant_id, il.company_id
|
|
FROM a76.invoice_logistics il
|
|
WHERE il.transport_id IS NOT NULL
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM a76.vehicle v WHERE v.vehicle_key = il.transport_id
|
|
)
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
INSERT INTO a76.trailer (trailer_number, tenant_id, company_id)
|
|
SELECT DISTINCT ON (il.trailer_num) il.trailer_num, il.tenant_id, il.company_id
|
|
FROM a76.invoice_logistics il
|
|
WHERE il.trailer_num IS NOT NULL
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM a76.trailer tr WHERE tr.trailer_number = il.trailer_num
|
|
)
|
|
"""
|
|
)
|
|
|
|
# backfill int refs
|
|
op.execute(
|
|
"""
|
|
UPDATE a76.invoice_logistics il
|
|
SET carrier_int_id = t.transporter_id
|
|
FROM a76.transporter t
|
|
WHERE il.carrier_id IS NOT NULL
|
|
AND il.carrier_id = t.transporter_key
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
UPDATE a76.invoice_logistics il
|
|
SET transport_int_id = v.vehicle_id
|
|
FROM a76.vehicle v
|
|
WHERE il.transport_id IS NOT NULL
|
|
AND il.transport_id = v.vehicle_key
|
|
"""
|
|
)
|
|
op.execute(
|
|
"""
|
|
UPDATE a76.invoice_logistics il
|
|
SET trailer_int_id = tr.trailer_id
|
|
FROM a76.trailer tr
|
|
WHERE il.trailer_num IS NOT NULL
|
|
AND il.trailer_num = tr.trailer_number
|
|
"""
|
|
)
|
|
|
|
# FK constraints
|
|
op.create_foreign_key(
|
|
"fk_a76_invoice_logistics_carrier_int_id_transporter_id",
|
|
"invoice_logistics",
|
|
"transporter",
|
|
["carrier_int_id"],
|
|
["transporter_id"],
|
|
source_schema="a76",
|
|
referent_schema="a76",
|
|
ondelete="SET NULL",
|
|
)
|
|
op.create_foreign_key(
|
|
"fk_a76_invoice_logistics_transport_int_id_vehicle_id",
|
|
"invoice_logistics",
|
|
"vehicle",
|
|
["transport_int_id"],
|
|
["vehicle_id"],
|
|
source_schema="a76",
|
|
referent_schema="a76",
|
|
ondelete="SET NULL",
|
|
)
|
|
op.create_foreign_key(
|
|
"fk_a76_invoice_logistics_trailer_int_id_trailer_id",
|
|
"invoice_logistics",
|
|
"trailer",
|
|
["trailer_int_id"],
|
|
["trailer_id"],
|
|
source_schema="a76",
|
|
referent_schema="a76",
|
|
ondelete="SET NULL",
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
pass
|
|
|