From 109a5e94442d4aa7e85b59a40269aaba47eb3329 Mon Sep 17 00:00:00 2001 From: liuyebo <1515783401@qq.com> Date: Tue, 12 Aug 2025 11:13:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=BF=87=E6=9C=9F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/__init__.py | 2 +- delete_deprecated_data.py | 64 +++++++++++++++++++++++++++++++++++++++ log/__init__.py | 16 ++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 delete_deprecated_data.py diff --git a/db/__init__.py b/db/__init__.py index 69931fe..20fb24c 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -19,5 +19,5 @@ DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}' SHOW_SQL = False Engine = create_engine(DB_URL, echo=SHOW_SQL) -Base = declarative_base(Engine) +Base = declarative_base() MysqlSession = sessionmaker(bind=Engine) diff --git a/delete_deprecated_data.py b/delete_deprecated_data.py new file mode 100644 index 0000000..999e757 --- /dev/null +++ b/delete_deprecated_data.py @@ -0,0 +1,64 @@ +# 删除本地数据库中的过期数据 +import logging.config +from datetime import datetime, timedelta + +from db import MysqlSession +from db.mysql import ZxPhhd, ZxIeCost, ZxIeDischarge, ZxIeResult, ZxIeSettlement, ZxPhrec +from log import LOGGING_CONFIG + +# 过期时间 +EXPIRATION_DAYS = 180 +# 批量删除数量 +BATCH_SIZE = 5000 +# 数据库会话对象 +session = None + + +def batch_delete_by_pk_phhd(model, pk_phhds): + """ + 批量删除指定模型中主键在指定列表中的数据 + + 参数: + model:SQLAlchemy模型类(对应数据库表) + pk_phhds:待删除的主键值列表 + + 返回: + 删除的记录数量 + """ + delete_count = ( + session.query(model) + .filter(model.pk_phhd.in_(pk_phhds)) + .delete(synchronize_session=False) + ) + session.commit() + logging.getLogger("sql").info(f"{model.__tablename__}成功删除{delete_count}条数据") + return delete_count + + +if __name__ == '__main__': + logging.config.dictConfig(LOGGING_CONFIG) + deadline = datetime.now() - timedelta(days=EXPIRATION_DAYS) + session = MysqlSession() + try: + while 1: + phhds = (session.query(ZxPhhd.pk_phhd) + .filter(ZxPhhd.paint_flag == "9") + .filter(ZxPhhd.billdate < deadline) + .limit(BATCH_SIZE) + .all()) + if not phhds or len(phhds) <= 0: + # 没有符合条件的数据,退出循环 + break + pk_phhd_values = [phhd.pk_phhd for phhd in phhds] + logging.getLogger("sql").info(f"过期的pk_phhd有{','.join(map(str, pk_phhd_values))}") + batch_delete_by_pk_phhd(ZxPhrec, pk_phhd_values) + batch_delete_by_pk_phhd(ZxIeResult, pk_phhd_values) + batch_delete_by_pk_phhd(ZxIeSettlement, pk_phhd_values) + batch_delete_by_pk_phhd(ZxIeDischarge, pk_phhd_values) + batch_delete_by_pk_phhd(ZxIeCost, pk_phhd_values) + batch_delete_by_pk_phhd(ZxPhhd, pk_phhd_values) + except Exception as e: + session.rollback() + logging.getLogger('error').error('过期数据删除失败!', exc_info=e) + finally: + session.close() diff --git a/log/__init__.py b/log/__init__.py index 7f83ed7..73f4f65 100644 --- a/log/__init__.py +++ b/log/__init__.py @@ -8,6 +8,7 @@ LOG_PATHS = [ f"log/{HOSTNAME}/ucloud", f"log/{HOSTNAME}/error", f"log/{HOSTNAME}/qr", + f"log/{HOSTNAME}/sql", ] for path in LOG_PATHS: if not os.path.exists(path): @@ -74,6 +75,16 @@ LOGGING_CONFIG = { 'backupCount': 14, 'encoding': 'utf-8', }, + 'sql': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'level': 'INFO', + 'formatter': 'standard', + 'filename': f'log/{HOSTNAME}/sql/fcb_photo_review_sql.log', + 'when': 'midnight', + 'interval': 1, + 'backupCount': 14, + 'encoding': 'utf-8', + }, }, # loggers定义了日志记录器 @@ -98,5 +109,10 @@ LOGGING_CONFIG = { 'level': 'DEBUG', 'propagate': False, }, + 'sql': { + 'handlers': ['console', 'sql'], + 'level': 'DEBUG', + 'propagate': False, + }, }, }