import pymysql from peewee import * from playhouse.pool import PooledMySQLDatabase pymysql.install_as_MySQLdb() # 连接池配置 # db = PooledMySQLDatabase( # 'haxi', # max_connections=50, # stale_timeout=300, # user='project3', # password='qw12as34', # host='192.168.50.103', # port=3306 # ) # # # class BaseModel(Model): # class Meta: # database = db # # @classmethod # def safe_get_or_create(cls, **kwargs): # """线程安全的获取或创建""" # try: # with db.atomic(): # return cls.get(**kwargs), False # except DoesNotExist: # try: # with db.atomic(): # return cls.create(**kwargs), True # except IntegrityError: # return cls.get(**kwargs), False # # def save(self, *args, **kwargs): # """使用自动连接上下文保存""" # with db.connection_context(): # 原生连接管理 # return super().save(*args, **kwargs) # # @classmethod # def get_or_create(cls, defaults=None, **kwargs): # """使用自动连接上下文获取或创建""" # with db.connection_context(): # 自动获取/释放连接 # return super().get_or_create(defaults=defaults, **kwargs) # 数据库配置 db_config = { 'database': 'hx', 'user': 'hx', 'password': 'haxi@123456', 'host': '192.168.11.30', 'port': 3306 } # # 数据库配置 # db_config = { # 'database': 'hx', # 'user': 'hx', # 'password': 'haxi@123456', # 'host': '192.168.11.30', # 'port': 3306 # } # 全局数据库实例 db = MySQLDatabase( db_config['database'], user=db_config['user'], password=db_config['password'], host=db_config['host'], port=db_config['port'] ) class BaseModel(Model): class Meta: database = db def save(self, *args, **kwargs): """在调用 save 时自动连接和关闭(若无事务)""" db.connect(reuse_if_open=True) try: result = super().save(*args, **kwargs) finally: # 若当前没有事务且连接仍然打开,则关闭连接 if not db.in_transaction() and not db.is_closed(): db.close() return result @classmethod def get_or_create(cls, defaults=None, **kwargs): """在调用 get_or_create 时自动连接和关闭(若无事务)""" db.connect(reuse_if_open=True) try: obj, created = super().get_or_create(defaults=defaults, **kwargs) finally: # 若当前没有事务且连接仍然打开,则关闭连接 if not db.in_transaction() and not db.is_closed(): db.close() return obj, created