db.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """
  2. FastAPI + SQLModel(SQLAlchemy)操作关系型数据库:引擎创建、启动时建表与轻量迁移、请求级Session生成。
  3. """
  4. from sqlalchemy import text
  5. from sqlmodel import Session, SQLModel, create_engine
  6. from app.core.config import settings
  7. #建立与数据库的连接通道
  8. engine = create_engine(settings.database_url, echo=False)
  9. def init_db() -> None:
  10. #应用启动时建表并对已有数据库进行维护
  11. SQLModel.metadata.create_all(engine)
  12. user_table = "`user`" if engine.dialect.name == "mysql" else '"user"'
  13. with Session(engine) as session:
  14. session.exec(
  15. text(f"UPDATE {user_table} SET role = :to_role WHERE role = :from_role"),
  16. params={"to_role": "teacher", "from_role": "admin"},
  17. )
  18. # MySQL 专用:扩长对话字段、为旧库 exercise 表补列
  19. if engine.dialect.name == "mysql":
  20. session.exec(text("ALTER TABLE chatmessage MODIFY COLUMN content LONGTEXT"))
  21. ddl_statements = [
  22. "ALTER TABLE exercise ADD COLUMN question_type VARCHAR(32) NULL",
  23. "ALTER TABLE exercise ADD COLUMN correct_answer LONGTEXT NULL",
  24. "ALTER TABLE exercise ADD COLUMN resolution LONGTEXT NULL",
  25. "ALTER TABLE exercise ADD COLUMN knowledge_grade VARCHAR(64) NULL",
  26. "ALTER TABLE exercise ADD COLUMN knowledge_category VARCHAR(128) NULL",
  27. "ALTER TABLE exercise ADD COLUMN knowledge_point_name VARCHAR(255) NULL",
  28. "ALTER TABLE exercise ADD COLUMN weight INT NOT NULL DEFAULT 0",
  29. ]
  30. for ddl in ddl_statements:
  31. try:
  32. session.exec(text(ddl))
  33. except Exception:
  34. pass
  35. try:
  36. session.exec(
  37. text(
  38. "ALTER TABLE exercise MODIFY COLUMN question_type VARCHAR(32) NULL "
  39. "COMMENT '题目类型:选择、填空、计算、判断'"
  40. )
  41. )
  42. except Exception:
  43. pass
  44. session.commit()
  45. def get_session():
  46. #每个请求注入一个数据库会话,请求结束自动关闭。
  47. with Session(engine) as session:
  48. yield session