mirror of
https://github.com/1Panel-dev/MaxKB.git
synced 2025-12-26 01:33:05 +00:00
fix: refactor collation refresh and reindex logic to improve error handling and connection management
Some checks are pending
sync2gitee / repo-sync (push) Waiting to run
Some checks are pending
sync2gitee / repo-sync (push) Waiting to run
This commit is contained in:
parent
a3b14cb562
commit
655ca53419
|
|
@ -1,26 +1,61 @@
|
|||
import logging
|
||||
|
||||
import psycopg
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def refresh_collation_and_reindex(apps, schema_editor):
|
||||
# 获取当前数据库名
|
||||
db_name = schema_editor.connection.settings_dict["NAME"]
|
||||
with schema_editor.connection.cursor() as cursor:
|
||||
cursor.execute(f'ALTER DATABASE "{db_name}" REFRESH COLLATION VERSION;')
|
||||
cursor.execute(f'REINDEX DATABASE "{db_name}";')
|
||||
from smartdoc.const import CONFIG
|
||||
|
||||
|
||||
def noop(apps, schema_editor):
|
||||
# 不可逆操作,留空
|
||||
pass
|
||||
def get_connect(db_name):
|
||||
conn_params = {
|
||||
"dbname": db_name,
|
||||
"user": CONFIG.get('DB_USER'),
|
||||
"password": CONFIG.get('DB_PASSWORD'),
|
||||
"host": CONFIG.get('DB_HOST'),
|
||||
"port": CONFIG.get('DB_PORT')
|
||||
}
|
||||
# 建立连接
|
||||
connect = psycopg.connect(**conn_params)
|
||||
return connect
|
||||
|
||||
|
||||
def sql_execute(conn, reindex_sql: str, alter_database_sql: str):
|
||||
"""
|
||||
执行一条sql
|
||||
@param reindex_sql:
|
||||
@param conn:
|
||||
@param alter_database_sql:
|
||||
"""
|
||||
conn.autocommit = True
|
||||
with conn.cursor() as cursor:
|
||||
cursor.execute(reindex_sql, [])
|
||||
cursor.execute(alter_database_sql, [])
|
||||
cursor.close()
|
||||
|
||||
def re_index(apps, schema_editor):
|
||||
app_db_name = CONFIG.get('DB_NAME')
|
||||
try:
|
||||
re_index_database(app_db_name)
|
||||
except Exception as e:
|
||||
logging.error(f'reindex database {app_db_name}发送错误:{str(e)}')
|
||||
try:
|
||||
re_index_database('root')
|
||||
except Exception as e:
|
||||
logging.error(f'reindex database root 发送错误:{str(e)}')
|
||||
|
||||
|
||||
def re_index_database(db_name):
|
||||
db_conn = get_connect(db_name)
|
||||
sql_execute(db_conn, f'REINDEX DATABASE "{db_name}";', f'ALTER DATABASE "{db_name}" REFRESH COLLATION VERSION;')
|
||||
db_conn.close()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
atomic = False # ALTER DATABASE/REINDEX 需在事务外执行
|
||||
|
||||
dependencies = [
|
||||
('setting', '0010_log'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(refresh_collation_and_reindex, reverse_code=noop),
|
||||
]
|
||||
migrations.RunPython(re_index, atomic=False)
|
||||
]
|
||||
|
|
|
|||
Loading…
Reference in New Issue