databaseUtil.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # databaseUtil.py
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.orm import sessionmaker, declarative_base
  4. from sqlalchemy import Column, Integer, String
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy.sql import text
  7. from contextlib import contextmanager
  8. from utils.rdbmsUtil.factoryRegistry import FactoryRegistry
  9. # 数据库类
  10. class DatabaseUtil:
  11. def __init__(self, url, pool_size=5, max_overflow=10, pool_recycle=100, pool_pre_ping=True, connect_timeout=10,read_timeout=1800):
  12. self.engine = create_engine(
  13. url,
  14. pool_size=pool_size, # 设置最大连接池大小
  15. max_overflow=max_overflow, # 设置最大溢出连接数
  16. pool_recycle=pool_recycle, # 设置连接回收时间
  17. pool_pre_ping=pool_pre_ping, # 检查连接的可用性
  18. connect_args={
  19. 'connect_timeout': connect_timeout, # 连接超时时间(秒)
  20. 'read_timeout': read_timeout # 读取超时时间(秒)
  21. } # 增加连接超时设置
  22. )
  23. self.Session = sessionmaker(bind=self.engine)
  24. def get_session(self):
  25. return self.Session()
  26. @contextmanager
  27. def session_scope(self):
  28. """Provide a transactional scope around a series of operations."""
  29. session = self.get_session()
  30. try:
  31. yield session
  32. session.commit()
  33. except Exception as e:
  34. session.rollback()
  35. raise
  36. finally:
  37. session.close()
  38. def close_session(self, session):
  39. """Explicitly close a given session."""
  40. if session:
  41. session.close()
  42. # # 事务管理
  43. # @contextmanager
  44. # def transaction_scope(session:Session):
  45. # try:
  46. # yield session
  47. # session.commit()
  48. # except Exception as e:
  49. # session.rollback()
  50. # raise e
  51. # finally:
  52. # session.close()
  53. # 实现动态 SQL 和批量操作支持的装饰器
  54. def sql_operation(sql, entity_type, batch=False):
  55. def decorator(func):
  56. def wrapper(self, session, *args, **kwargs):
  57. factory = FactoryRegistry.get_factory(entity_type)
  58. if callable(sql): # 检查sql是否为可调用对象,即函数
  59. resolved_sql = sql(*args, **kwargs) # 如果是函数,执行它以获取SQL字符串
  60. else:
  61. resolved_sql = sql # 否则直接使用sql字符串
  62. print(f"Self: {self}")
  63. print(f"Session: {session}")
  64. print(f"Session type: {type(session)}")
  65. print(f"SQL: {resolved_sql}")
  66. print(f"Args: {args}")
  67. print(f"Kwargs: {kwargs}")
  68. results = []
  69. if batch:
  70. for entity in args[0]:
  71. # 使用参数直接执行SQL,防止注入
  72. params = {key: getattr(
  73. entity, key) for key in entity.__dict__ if not key.startswith('_')}
  74. r = session.execute(text(resolved_sql), params)
  75. print(r)
  76. else:
  77. # 单个操作的情况
  78. result = session.execute(text(resolved_sql), kwargs)
  79. if result.returns_rows:
  80. results.extend([factory(**dict(row))
  81. for row in result.mappings()])
  82. else:
  83. # 如果不需要处理返回结果,这里可以直接pass
  84. pass
  85. return results
  86. return wrapper
  87. return decorator