database.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import logging
  2. from contextvars import ContextVar
  3. from typing import Callable
  4. import redis
  5. from sqlmodel import SQLModel, create_engine
  6. from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
  7. from sqlalchemy.pool import AsyncAdaptedQueuePool, QueuePool
  8. from sqlalchemy.orm import sessionmaker, scoped_session
  9. from config.config import settings
  10. from config.database import db_settings, redis_settings
  11. db_state_default = {"closed": None, "conn": None, "ctx": None, "transactions": None}
  12. db_state = ContextVar("db_state", default=db_state_default.copy())
  13. # database
  14. connect_args = {}
  15. database_url = db_settings.database_url
  16. engine = create_engine(
  17. database_url,
  18. pool_pre_ping=True, # 设置心跳
  19. connect_args=connect_args,
  20. poolclass=QueuePool,
  21. pool_size=db_settings.DB_POOL_SIZE,
  22. pool_recycle=db_settings.DB_POOL_RECYCLE,
  23. echo=settings.DEBUG,
  24. max_overflow=db_settings.DB_OVERLOW,
  25. )
  26. session = scoped_session(sessionmaker(bind=engine))
  27. async_database_url = db_settings.async_database_url
  28. async_engine = create_async_engine(
  29. async_database_url,
  30. connect_args=connect_args,
  31. pool_pre_ping=True, # 设置心跳
  32. poolclass=AsyncAdaptedQueuePool,
  33. pool_size=db_settings.DB_POOL_SIZE,
  34. pool_recycle=db_settings.DB_POOL_RECYCLE,
  35. echo=settings.DEBUG,
  36. max_overflow=db_settings.DB_OVERLOW,
  37. )
  38. # 创建session元类
  39. async_session_local: Callable[..., AsyncSession] = sessionmaker(
  40. class_=AsyncSession,
  41. bind=async_engine,
  42. )
  43. def create_db_and_tables():
  44. logging.debug("Creating database and tables")
  45. import app.models # noqa
  46. SQLModel.metadata.create_all(async_engine)
  47. logging.debug("Database and tables created successfully")
  48. # redis
  49. redis_pool = redis.ConnectionPool(
  50. host=redis_settings.REDIS_HOST,
  51. port=redis_settings.REDIS_PORT,
  52. db=redis_settings.REDIS_DB,
  53. password=redis_settings.REDIS_PASSWORD,
  54. decode_responses=True,
  55. )
  56. redis_client = redis.Redis(connection_pool=redis_pool)