102 lines
2.7 KiB
Python
102 lines
2.7 KiB
Python
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
|