database.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. connect_args=connect_args,
  19. poolclass=QueuePool,
  20. pool_size=db_settings.DB_POOL_SIZE,
  21. pool_recycle=db_settings.DB_POOL_RECYCLE,
  22. echo=settings.DEBUG,
  23. )
  24. session = scoped_session(sessionmaker(bind=engine))
  25. async_database_url = db_settings.async_database_url
  26. async_engine = create_async_engine(
  27. async_database_url,
  28. connect_args=connect_args,
  29. poolclass=AsyncAdaptedQueuePool,
  30. pool_size=db_settings.DB_POOL_SIZE,
  31. pool_recycle=db_settings.DB_POOL_RECYCLE,
  32. echo=settings.DEBUG,
  33. )
  34. # 创建session元类
  35. async_session_local: Callable[..., AsyncSession] = sessionmaker(
  36. class_=AsyncSession,
  37. bind=async_engine,
  38. )
  39. def create_db_and_tables():
  40. logging.debug("Creating database and tables")
  41. import app.models # noqa
  42. SQLModel.metadata.create_all(async_engine)
  43. logging.debug("Database and tables created successfully")
  44. # redis
  45. redis_pool = redis.ConnectionPool(
  46. host=redis_settings.REDIS_HOST,
  47. port=redis_settings.REDIS_PORT,
  48. db=redis_settings.REDIS_DB,
  49. password=redis_settings.REDIS_PASSWORD,
  50. decode_responses=True,
  51. )
  52. redis_client = redis.Redis(connection_pool=redis_pool)