committed by
GitHub
9 changed files with 746 additions and 561 deletions
@ -0,0 +1,90 @@ |
|||
"""Edit replace id integers in all models to use UUID instead |
|||
|
|||
Revision ID: d98dd8ec85a3 |
|||
Revises: 9c0a54914c78 |
|||
Create Date: 2024-07-19 04:08:04.000976 |
|||
|
|||
""" |
|||
from alembic import op |
|||
import sqlalchemy as sa |
|||
import sqlmodel.sql.sqltypes |
|||
from sqlalchemy.dialects import postgresql |
|||
|
|||
|
|||
# revision identifiers, used by Alembic. |
|||
revision = 'd98dd8ec85a3' |
|||
down_revision = '9c0a54914c78' |
|||
branch_labels = None |
|||
depends_on = None |
|||
|
|||
|
|||
def upgrade(): |
|||
# Ensure uuid-ossp extension is available |
|||
op.execute('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"') |
|||
|
|||
# Create a new UUID column with a default UUID value |
|||
op.add_column('user', sa.Column('new_id', postgresql.UUID(as_uuid=True), default=sa.text('uuid_generate_v4()'))) |
|||
op.add_column('item', sa.Column('new_id', postgresql.UUID(as_uuid=True), default=sa.text('uuid_generate_v4()'))) |
|||
op.add_column('item', sa.Column('new_owner_id', postgresql.UUID(as_uuid=True), nullable=True)) |
|||
|
|||
# Populate the new columns with UUIDs |
|||
op.execute('UPDATE "user" SET new_id = uuid_generate_v4()') |
|||
op.execute('UPDATE item SET new_id = uuid_generate_v4()') |
|||
op.execute('UPDATE item SET new_owner_id = (SELECT new_id FROM "user" WHERE "user".id = item.owner_id)') |
|||
|
|||
# Set the new_id as not nullable |
|||
op.alter_column('user', 'new_id', nullable=False) |
|||
op.alter_column('item', 'new_id', nullable=False) |
|||
|
|||
# Drop old columns and rename new columns |
|||
op.drop_constraint('item_owner_id_fkey', 'item', type_='foreignkey') |
|||
op.drop_column('item', 'owner_id') |
|||
op.alter_column('item', 'new_owner_id', new_column_name='owner_id') |
|||
|
|||
op.drop_column('user', 'id') |
|||
op.alter_column('user', 'new_id', new_column_name='id') |
|||
|
|||
op.drop_column('item', 'id') |
|||
op.alter_column('item', 'new_id', new_column_name='id') |
|||
|
|||
# Create primary key constraint |
|||
op.create_primary_key('user_pkey', 'user', ['id']) |
|||
op.create_primary_key('item_pkey', 'item', ['id']) |
|||
|
|||
# Recreate foreign key constraint |
|||
op.create_foreign_key('item_owner_id_fkey', 'item', 'user', ['owner_id'], ['id']) |
|||
|
|||
def downgrade(): |
|||
# Reverse the upgrade process |
|||
op.add_column('user', sa.Column('old_id', sa.Integer, autoincrement=True)) |
|||
op.add_column('item', sa.Column('old_id', sa.Integer, autoincrement=True)) |
|||
op.add_column('item', sa.Column('old_owner_id', sa.Integer, nullable=True)) |
|||
|
|||
# Populate the old columns with default values |
|||
# Generate sequences for the integer IDs if not exist |
|||
op.execute('CREATE SEQUENCE IF NOT EXISTS user_id_seq AS INTEGER OWNED BY "user".old_id') |
|||
op.execute('CREATE SEQUENCE IF NOT EXISTS item_id_seq AS INTEGER OWNED BY item.old_id') |
|||
|
|||
op.execute('SELECT setval(\'user_id_seq\', COALESCE((SELECT MAX(old_id) + 1 FROM "user"), 1), false)') |
|||
op.execute('SELECT setval(\'item_id_seq\', COALESCE((SELECT MAX(old_id) + 1 FROM item), 1), false)') |
|||
|
|||
op.execute('UPDATE "user" SET old_id = nextval(\'user_id_seq\')') |
|||
op.execute('UPDATE item SET old_id = nextval(\'item_id_seq\'), old_owner_id = (SELECT old_id FROM "user" WHERE "user".id = item.owner_id)') |
|||
|
|||
# Drop new columns and rename old columns back |
|||
op.drop_constraint('item_owner_id_fkey', 'item', type_='foreignkey') |
|||
op.drop_column('item', 'owner_id') |
|||
op.alter_column('item', 'old_owner_id', new_column_name='owner_id') |
|||
|
|||
op.drop_column('user', 'id') |
|||
op.alter_column('user', 'old_id', new_column_name='id') |
|||
|
|||
op.drop_column('item', 'id') |
|||
op.alter_column('item', 'old_id', new_column_name='id') |
|||
|
|||
# Create primary key constraint |
|||
op.create_primary_key('user_pkey', 'user', ['id']) |
|||
op.create_primary_key('item_pkey', 'item', ['id']) |
|||
|
|||
# Recreate foreign key constraint |
|||
op.create_foreign_key('item_owner_id_fkey', 'item', 'user', ['owner_id'], ['id']) |
File diff suppressed because it is too large
Loading…
Reference in new issue