database.py 1.9 KB

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