Skip to content

Commit 7313ddc

Browse files
committed
add uv for project management and sqmodel to model entity
1 parent 5938ca8 commit 7313ddc

File tree

11 files changed

+74
-36
lines changed

11 files changed

+74
-36
lines changed

alembic/env.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
from asyncpg import Connection
1414
import asyncio
1515

16+
from sqlmodel import SQLModel
17+
from alembic import context
18+
from models import * # Import your SQLModel models here
19+
1620
# this is the Alembic Config object, which provides
1721
# access to the values within the .ini file in use.
1822
config = context.config
@@ -37,6 +41,7 @@ def get_url():
3741
# for 'autogenerate' support
3842
# from myapp import mymodel
3943
# target_metadata = mymodel.Base.metadata
44+
target_metadata = SQLModel.metadata
4045
target_metadata = Base.metadata
4146

4247
print(f"target_metadata: ")

database/dao/dao_posts.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sqlalchemy.future import select
2-
from models.posts import Post
2+
from models.posts import Posts
33
from schemas.posts import PostCreate
44
from sqlalchemy.ext.asyncio import AsyncSession
55

@@ -14,32 +14,32 @@ def __init__(self, db: AsyncSession):
1414

1515

1616
async def get_post_user(self, user_id: int):
17-
result = await self.db.execute(select(Post).where(Post.user_id == user_id))
17+
result = await self.db.execute(select(Posts).where(Posts.user_id == user_id))
1818
posts = result.scalars()
1919
return posts
2020

2121
async def get_post_by_id(self, post_id: int):
22-
result = await self.db.execute(select(Post).where(Post.id == post_id))
22+
result = await self.db.execute(select(Posts).where(Posts.id == post_id))
2323
post = result.scalar_one_or_none()
2424
return post
2525

2626
async def get_post_by_user_id(self, user_id:int):
2727

28-
result = await self.db.execute(select(Post).filter(Post.user_id == user_id))
28+
result = await self.db.execute(select(Posts).filter(Posts.user_id == user_id))
2929
posts = result.scalars()
3030
return posts
3131

3232

3333

3434
async def create_post(self, post_create:PostCreate, user_id: int):
35-
post = Post(title=post_create.title, content=post_create.content, user_id=user_id)
35+
post = Posts(title=post_create.title, content=post_create.content, user_id=user_id)
3636
self.db.add(post)
3737
await self.db.commit()
3838
await self.db.refresh(post)
3939

4040
return post
4141

42-
async def delete_post(self, post: Post):
42+
async def delete_post(self, post: Posts):
4343

4444
await self.db.delete(post)
4545
await self.db.commit()

database/dao/dao_users.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from sqlalchemy.future import select
22
from sqlalchemy.ext.asyncio import AsyncSession
3-
from models.users import User
3+
from models.users import Users
44
from pydantic import EmailStr
55
from passlib.context import CryptContext
66
from schemas.users import UserCreate
7-
from models.users import User
87
import asyncio
98

109
hash_helper = CryptContext(schemes=["bcrypt"])
@@ -20,31 +19,31 @@ def __init__(self, db: AsyncSession) -> None:
2019
self.db = db
2120

2221
async def get_users(self):
23-
users = self.db.query(User).all()
22+
users = self.db.query(Users).all()
2423
return users
2524

2625

2726
async def get_user_by_email(self, email: str):
2827

29-
result = await self.db.execute(select(User).where(User.email == email))
28+
result = await self.db.execute(select(Users).where(Users.email == email))
3029
user = result.scalar_one_or_none()
3130
return user
3231

3332
async def get_user_by_id(self, user_id: int):
34-
result = await self.db.execute(select(User).where(User.id == user_id))
33+
result = await self.db.execute(select(Users).where(Users.id == user_id))
3534
user = result.scalar_one_or_none()
3635
return user
3736

3837

3938
async def create_new_user(self, user: UserCreate):
40-
user_db = User(email=user.email, fullname=user.fullname, password = hash_helper.encrypt(user.password))
39+
user_db = Users(email=user.email, fullname=user.fullname, password = hash_helper.encrypt(user.password))
4140
self.db.add(user_db)
4241
await self.db.commit()
4342
await self.db.refresh(user_db)
4443
return user_db
4544

4645
async def get_users(self, skip: int = 0, limit: int = 100):
47-
result = await self.db.execute(select(User).offset(skip).limit(limit))
46+
result = await self.db.execute(select(Users).offset(skip).limit(limit))
4847
users = result.scalars()
4948
return users
5049

database/database.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import dotenv
2+
from sqlmodel import SQLModel
23
from sqlalchemy import create_engine
34
from sqlalchemy.ext.declarative import declarative_base
45
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker

models/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
from .users import User
2-
from .posts import Post

models/posts.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
from sqlalchemy import Column, Integer, String, ForeignKey
2-
from sqlalchemy.orm import Relationship
31
from database.database import Base
4-
from sqlalchemy.orm import relationship
2+
from sqlmodel import Field, SQLModel
53

6-
class Post(Base):
74

8-
__tablename__ = "posts"
5+
class Posts(SQLModel, table=True):
96

10-
id: int = Column(Integer, primary_key=True, index=True)
11-
title: str = Column(String,)
12-
content: str = Column (String)
13-
user_id: int = Column(Integer, ForeignKey('users.id'))
7+
id: int = Field(default=None, primary_key=True)
8+
title: str
9+
content: str
10+
user_id: int = Field(default=None, foreign_key='users.id')
1411

1512
def __repr__(self):
1613
return f"<Post {self.id} {self.content[:20]}...>"

models/users.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
from pydantic import EmailStr
33
from sqlalchemy import Column, String, Integer
44
from sqlalchemy.orm import relationship
5+
from sqlmodel import Field, SQLModel
56

6-
7-
class User(Base):
8-
__tablename__ = "users"
9-
id: int = Column(Integer, primary_key=True, index=True)
10-
email : EmailStr = Column(String(50), index=True, unique=True, nullable=False)
11-
fullname : str = Column(String(50),)
7+
class Users(SQLModel, table = True):
8+
9+
id: int = Field(default=None, primary_key=True)
10+
email : EmailStr = Field(index=True, unique=True, nullable=False)
11+
fullname : str
1212
password: str = Column(String(100), nullable=False)
1313

1414

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ dependencies = [
1111
"dotenv>=0.9.9",
1212
"fastapi>=0.115.12",
1313
"passlib[bcrypt]>=1.7.4",
14+
"psycopg2-binary>=2.9.10",
1415
"pydantic[email]>=2.11.7",
1516
"pyjwt>=2.10.1",
1617
"python-dotenv>=1.1.0",
1718
"python-multipart>=0.0.20",
19+
"sqlmodel>=0.0.24",
1820
"uvicorn>=0.34.3",
1921
]

routes/posts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from sqlalchemy.ext.asyncio import AsyncSession
33
from auth.deps import get_db, get_current_user
44
from schemas.posts import PostCreate
5-
from models.users import User
5+
from models.users import Users
66
from fastapi import HTTPException
77
from database.dao.dao_posts import DaoPost
88
from database.dao.dao_users import DaoUser
@@ -12,7 +12,7 @@
1212

1313

1414
@PostRouter.post("", response_model=PostResponseModel)
15-
async def create_new_post(post_create: PostCreate, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user)):
15+
async def create_new_post(post_create: PostCreate, db: AsyncSession = Depends(get_db), user: Users = Depends(get_current_user)):
1616

1717
daoPost = DaoPost(db=db)
1818
daoUser = DaoUser(db=db)
@@ -25,7 +25,7 @@ async def create_new_post(post_create: PostCreate, db: AsyncSession = Depends(ge
2525

2626

2727
@PostRouter.delete("/{id_post}")
28-
async def delete_posts(id_post:int, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user)):
28+
async def delete_posts(id_post:int, db: AsyncSession = Depends(get_db), user: Users = Depends(get_current_user)):
2929
daoPost = DaoPost(db=db)
3030

3131
post_exist = await daoPost.get_post_by_id(post_id=id_post)

routes/users.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from fastapi import APIRouter, Depends, Body, status
22
from schemas.users import UserCreate
3-
from models.users import User
3+
from models.users import Users
44
from sqlalchemy.ext.asyncio import AsyncSession
55
from database.dao.dao_posts import DaoPost
66
from database.dao.dao_users import DaoUser
@@ -48,7 +48,7 @@ async def get_acces_token(db: AsyncSession = Depends(get_db), user_credentiel: O
4848

4949

5050
@UserRouter.get("/{user_id}/posts")
51-
async def get_all_posts_user(user_id:int, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user))-> List[PostResponseModel]:
51+
async def get_all_posts_user(user_id:int, db: AsyncSession = Depends(get_db), user: Users = Depends(get_current_user))-> List[PostResponseModel]:
5252

5353
if user_id!=user.id:
5454
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="your id does not match that of the authentication")
@@ -84,7 +84,7 @@ async def create_new_users(user: UserCreate, db: AsyncSession = Depends(get_db))
8484

8585

8686
@UserRouter.get("", response_model=List[UserResponseModel])
87-
async def get_all_user(db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), skip: int = 0, limit: int = 100)->List[UserResponseModel]:
87+
async def get_all_user(db: AsyncSession = Depends(get_db), user: Users = Depends(get_current_user), skip: int = 0, limit: int = 100)->List[UserResponseModel]:
8888
daoUser = DaoUser(db=db)
8989
return await daoUser.get_users(skip=skip, limit=limit)
9090

0 commit comments

Comments
 (0)