开发机迁移
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""数据库连接管理器(限制最大连接超时时间)。"""
|
||||
|
||||
import time
|
||||
|
||||
import psycopg2
|
||||
import psycopg2.extras
|
||||
|
||||
# 连接重试参数:应对 PostgreSQL 瞬时不可用
|
||||
_CONNECT_MAX_RETRIES = 3
|
||||
_CONNECT_RETRY_DELAY = 1.0
|
||||
|
||||
|
||||
class DatabaseConnection:
|
||||
"""封装 psycopg2 连接,支持会话参数和超时保护。"""
|
||||
@@ -24,11 +30,25 @@ class DatabaseConnection:
|
||||
# assumptions: libpq 默认使用系统 locale 的 client_encoding,Windows 中文系统为 GBK/CP936
|
||||
# 边界: 显式指定 client_encoding=utf8 确保连接层始终使用 UTF-8,与数据库 server_encoding 一致
|
||||
# 验证: web-admin 手动触发 ETL 全量 flow,不再出现 0xd6 解码错误
|
||||
conn = psycopg2.connect(
|
||||
self._dsn,
|
||||
connect_timeout=timeout_val,
|
||||
options="-c client_encoding=utf8",
|
||||
)
|
||||
last_exc = None
|
||||
for attempt in range(_CONNECT_MAX_RETRIES):
|
||||
try:
|
||||
conn = psycopg2.connect(
|
||||
self._dsn,
|
||||
connect_timeout=timeout_val,
|
||||
options="-c client_encoding=utf8",
|
||||
keepalives=1,
|
||||
keepalives_idle=60,
|
||||
keepalives_interval=10,
|
||||
keepalives_count=3,
|
||||
)
|
||||
break
|
||||
except psycopg2.OperationalError as e:
|
||||
last_exc = e
|
||||
if attempt < _CONNECT_MAX_RETRIES - 1:
|
||||
time.sleep(_CONNECT_RETRY_DELAY * (attempt + 1))
|
||||
else:
|
||||
raise last_exc
|
||||
conn.autocommit = False
|
||||
|
||||
# 会话参数(时区、语句超时等)
|
||||
|
||||
@@ -30,6 +30,16 @@ class DatabaseOperations:
|
||||
@property
|
||||
def _connect_timeout(self):
|
||||
return self._connection._connect_timeout
|
||||
|
||||
def ensure_open(self) -> bool:
|
||||
"""透传 DatabaseConnection.ensure_open(),重连后同步 self.conn 引用。"""
|
||||
result = self._connection.ensure_open()
|
||||
self.conn = self._connection.conn
|
||||
return result
|
||||
|
||||
def rollback(self):
|
||||
"""透传 DatabaseConnection.rollback()。"""
|
||||
self._connection.rollback()
|
||||
|
||||
def batch_execute(self, sql: str, rows: list, page_size: int = 1000):
|
||||
"""批量执行SQL"""
|
||||
|
||||
Reference in New Issue
Block a user