database.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # -*- coding: utf-8 -*-
  2. """MySQL 数据库:用户、习题、答题记录、错题、熟练度、答疑会话、学情报表"""
  3. import pymysql
  4. pymysql.install_as_MySQLdb()
  5. from sqlalchemy import create_engine, inspect, text
  6. from sqlalchemy.ext.declarative import declarative_base
  7. from sqlalchemy.orm import sessionmaker, Session
  8. from backend.config import get_settings
  9. settings = get_settings()
  10. engine = create_engine(settings.MYSQL_URI, pool_pre_ping=True)
  11. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  12. Base = declarative_base()
  13. def get_db() -> Session:
  14. db = SessionLocal()
  15. try:
  16. yield db
  17. finally:
  18. db.close()
  19. def ensure_user_profile_columns() -> None:
  20. """
  21. 确保 users 表中存在个人信息相关字段。
  22. - 对于全新数据库:由 SQLAlchemy 根据模型一次性创建完整表结构;
  23. - 对于已存在的表:在缺少字段时自动执行 ALTER TABLE 补列,避免手动迁移。
  24. """
  25. inspector = inspect(engine)
  26. if "users" not in inspector.get_table_names():
  27. return
  28. existing_columns = {col["name"] for col in inspector.get_columns("users")}
  29. alters = []
  30. if "full_name" not in existing_columns:
  31. alters.append("ADD COLUMN full_name VARCHAR(50) NULL")
  32. if "student_id" not in existing_columns:
  33. alters.append("ADD COLUMN student_id VARCHAR(50) NULL")
  34. if "class_name" not in existing_columns:
  35. alters.append("ADD COLUMN class_name VARCHAR(100) NULL")
  36. if "grade" not in existing_columns:
  37. alters.append("ADD COLUMN grade VARCHAR(20) NULL")
  38. if "email" not in existing_columns:
  39. alters.append("ADD COLUMN email VARCHAR(120) NULL")
  40. if "phone" not in existing_columns:
  41. alters.append("ADD COLUMN phone VARCHAR(20) NULL")
  42. if not alters:
  43. return
  44. alter_sql = "ALTER TABLE users " + ", ".join(alters)
  45. with engine.connect() as conn:
  46. conn.execute(text(alter_sql))