Skip to content

Commit a6a7cb4

Browse files
committed
refactor: use uuids instead of integer ids
fastapi/full-stack-fastapi-template#1259
1 parent 4895306 commit a6a7cb4

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

backend/app/alembic/versions/3e7ae2bab77f_create_release_model.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
Create Date: 2024-07-25 02:46:50.518100
66
77
"""
8+
import uuid
9+
810
from alembic import op
911
import sqlalchemy as sa
1012
import sqlmodel.sql.sqltypes
11-
13+
from sqlalchemy.dialects import postgresql
1214

1315
# revision identifiers, used by Alembic.
1416
revision = '3e7ae2bab77f'
@@ -20,7 +22,10 @@
2022
def upgrade():
2123
op.create_table(
2224
"release",
23-
sa.Column('id', sa.Integer(), nullable=False),
25+
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False, default=sa.text('uuid_generate_v4()')),
26+
# sa.Column('id', sa.String(36), primary_key=True, default=str(uuid.uuid4()), unique=True, nullable=False),
27+
# sa.Column('id', postgresql.UUID(as_uuid=True), default=uuid.uuid4, nullable=False),
28+
# sa.Column('id', sa.Integer(), nullable=False),
2429
sa.Column('discogs_url', sqlmodel.sql.sqltypes.AutoString()),
2530
sa.Column('discogs_title', sqlmodel.sql.sqltypes.AutoString()),
2631
sa.Column('title', sqlmodel.sql.sqltypes.AutoString()),

backend/app/api/routes/releases.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import uuid
12
from typing import Any
23

34
from fastapi import APIRouter, HTTPException
@@ -42,7 +43,7 @@ def read_releases(
4243

4344

4445
@router.get("/{id}", response_model=ReleasePublic)
45-
def read_release(session: SessionDep, current_user: CurrentUser, id: int) -> Any:
46+
def read_release(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) -> Any:
4647
"""
4748
Get release by ID.
4849
"""
@@ -61,7 +62,7 @@ def create_release(
6162
"""
6263
Create new release.
6364
"""
64-
release = Release.model_validate(release_in, update={"owner_id": current_user.id})
65+
release = Release.model_validate(release_in)
6566
session.add(release)
6667
session.commit()
6768
session.refresh(release)
@@ -70,7 +71,7 @@ def create_release(
7071

7172
@router.put("/{id}", response_model=ReleasePublic)
7273
def update_release(
73-
*, session: SessionDep, current_user: CurrentUser, id: int, release_in: ReleaseUpdate
74+
*, session: SessionDep, current_user: CurrentUser, id: uuid.UUID, release_in: ReleaseUpdate
7475
) -> Any:
7576
"""
7677
Update an release.
@@ -89,7 +90,7 @@ def update_release(
8990

9091

9192
@router.delete("/{id}")
92-
def delete_release(session: SessionDep, current_user: CurrentUser, id: int) -> Message:
93+
def delete_release(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) -> Message:
9394
"""
9495
Delete an release.
9596
"""

backend/app/models/release.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import uuid
12
from datetime import date
23

34
from sqlmodel import Field, SQLModel
45

56

67
# Shared properties
78
class ReleaseBase(SQLModel):
8-
title: str = Field(min_length=1, max_length=255)
9+
title: str | None = Field(default=None, min_length=1, max_length=255)
910

1011

1112
# Properties to receive on item creation
@@ -38,8 +39,7 @@ class ReleaseUpdate(ReleaseBase):
3839

3940
# Database model, database table inferred from class name
4041
class Release(ReleaseBase, table=True):
41-
id: int | None = Field(default=None, primary_key=True)
42-
42+
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
4343
discogs_url: str | None = Field(default=None, max_length=255)
4444
discogs_title: str | None = Field(default=None, max_length=255)
4545
title: str | None = Field(default=None, max_length=255)
@@ -54,7 +54,7 @@ class Release(ReleaseBase, table=True):
5454

5555
# Properties to return via API, id is always required
5656
class ReleasePublic(ReleaseBase):
57-
id: int
57+
id: uuid.UUID
5858
discogs_url: str | None
5959
discogs_title: str | None
6060
title: str | None
@@ -69,4 +69,4 @@ class ReleasePublic(ReleaseBase):
6969

7070
class ReleasesPublic(SQLModel):
7171
data: list[ReleasePublic]
72-
count: int
72+
count: int

0 commit comments

Comments
 (0)