-
-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
♻️ Edit refactor db models to use UUID's instead of integer ID's (#1259)
Co-authored-by: Sebastián Ramírez <[email protected]>
- Loading branch information
1 parent
cc480df
commit e65b427
Showing
9 changed files
with
746 additions
and
561 deletions.
There are no files selected for viewing
90 changes: 90 additions & 0 deletions
90
backend/app/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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']) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.