Python刷题系统实训三:数据库相关2
四、使用 SQLAlchemy 定义数据库模型
使用类映射数据库表,结合 Pydantic 进行数据验证。
定义基类 Basedb,继承 DeclarativeBase:
class Basedb(DeclarativeBase):
Pass
用户表模型:
class UserDB(Basedb):
__tablename__= "user"
id:Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
username:Mapped[str] = mapped_column(String(30), unique=True)
password: Mapped[str] = mapped_column(String(100))
该模型类 UserDB 继承 Basedb 基类,映射到名为 user 的数据库表。__tablename__ = "user" 指明表名,表中包含 id、username、password 三个字段。
题库表模型:
class Exam(Basedb):
__tablename__= "exam_tm"
id:Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
tm:Mapped[str] = mapped_column(String(255))
ana:Mapped[str] = mapped_column(String(255))
anb:Mapped[str] = mapped_column(String(255))
anc:Mapped[str] = mapped_column(String(255))
andd:Mapped[str] = mapped_column(String(255))
tan:Mapped[str] = mapped_column(String(255))
tlx: Mapped[str] = mapped_column(String(30))
成绩表模型:
class Chengji(Basedb):
__tablename__= "chengji"
id:Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
userid:Mapped[int] = mapped_column(Integer)
chengji:Mapped[int] = mapped_column(Integer)
leibie: Mapped[str] = mapped_column(String(50))
五、Pydantic 数据验证
系统有登录页面,需输入 username 和 password。FastAPI 接收 POST 请求体时,需用 Pydantic 的 BaseModel 定义数据结构,确保参数类型与约束合规(与 SQLAlchemy 模型对应):
from pydantic import BaseModel
class Base(BaseModel):
pass
class User(Base):
username:str
password: str
六、查询数据示例:查询ID号为2的用户考试成绩情况。
@app.get("/me")
def get_me(request: Request, db: Session = Depends(get_db)):
question_list= db.query(Chengji).where(Chengji.userid == 2).all()
print(question_list[0].leibie,question_list[0].chengji)
return{"data": question_list}