diff --git a/stock-html/routes/admin.py b/stock-html/routes/admin.py
index eb62d8c..2e84ff3 100644
--- a/stock-html/routes/admin.py
+++ b/stock-html/routes/admin.py
@@ -753,13 +753,9 @@ def trigger_kline_sync():
def kline_sync_status():
"""管理员查询K线同步状态"""
try:
- import psycopg2
- from config import Config
-
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor()
# K线数据统计
@@ -1282,13 +1278,10 @@ def admin_scan_status():
"""管理员查询扫描进度"""
try:
from datetime import datetime
- import psycopg2
- from config import Config
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor()
scan_date = datetime.now().strftime('%Y-%m-%d')
diff --git a/stock-html/routes/analysis.py b/stock-html/routes/analysis.py
index df01d28..b588f2d 100644
--- a/stock-html/routes/analysis.py
+++ b/stock-html/routes/analysis.py
@@ -15,7 +15,8 @@ from services.stock_algorithms import (
)
from db import (
login_required, get_current_user_id,
- db_get_alerts_cache, db_save_alerts_cache
+ db_get_alerts_cache, db_save_alerts_cache,
+ get_db, put_db
)
bp = Blueprint('analysis', __name__, url_prefix='/api')
@@ -399,7 +400,7 @@ def ai_analyze_stream(stock_code):
_cur.execute("INSERT INTO ai_call_log (user_id, stock_code, stock_name) VALUES (%s, %s, %s)",
(_uid, stock_code, stock_name))
_conn.commit()
- _put_db(conn)
+ put_db(_conn)
except Exception:
pass
@@ -544,10 +545,8 @@ def batch_technical_signals():
"""批量检测技术交易信号 — 优先从 stock_signal_scan 读取(与提醒一致),无记录时实时计算"""
try:
import pandas as pd
- import psycopg2
from psycopg2.extras import RealDictCursor
from services.signal_detector import detect_all_signals
- from config import Config
data = request.get_json()
codes = data.get('codes', [])
@@ -566,10 +565,9 @@ def batch_technical_signals():
change_map = {}
scan_map = {}
try:
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ raise Exception('数据库连接失败')
cur = conn.cursor(cursor_factory=RealDictCursor)
placeholders = ','.join(['%s'] * len(codes))
@@ -675,9 +673,6 @@ def batch_technical_signals():
def get_scan_results():
"""查询全量扫描结果"""
try:
- import psycopg2
- from config import Config
-
scan_date = request.args.get('date', datetime.now().strftime('%Y-%m-%d'))
min_triggered = int(request.args.get('min_triggered', 0))
signal_type = request.args.get('signal_type', '')
@@ -689,10 +684,9 @@ def get_scan_results():
holding_set = set(c.strip() for c in holding_codes_str.split(',') if c.strip())
recommend_text = (request.args.get('recommend_text') or '').strip()
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor()
# 检查请求日期是否有数据,如果没有则自动回退到最近可用的扫描日期
@@ -955,9 +949,7 @@ def _compute_recommend(signal_status, indicators, triggered_count, is_holding):
@bp.route('/signal_alerts', methods=['POST'])
def signal_alerts():
"""基于信号扫描结果生成买入/卖出/观望提醒(与扫描结果共用 _compute_recommend)"""
- import psycopg2
from psycopg2.extras import RealDictCursor
- from config import Config
try:
data = request.get_json() or {}
@@ -968,10 +960,9 @@ def signal_alerts():
if not stock_codes:
return jsonify({'success': True, 'results': []})
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor(cursor_factory=RealDictCursor)
# 优先今天的扫描数据,无则回退到最近可用日期
@@ -1127,13 +1118,9 @@ def get_stock_score_detail(code):
def get_scan_status():
"""查询扫描进度"""
try:
- import psycopg2
- from config import Config
-
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor()
scan_date = datetime.now().strftime('%Y-%m-%d')
@@ -1210,18 +1197,15 @@ def start_full_scan():
def get_scan_strategy():
"""基于体系最强战法,给出分梯队买卖建议。与全景扫描推荐共用 _compute_recommend,算法一致。"""
try:
- import psycopg2
from psycopg2.extras import RealDictCursor
- from config import Config
scan_date = request.args.get('date', datetime.now().strftime('%Y-%m-%d'))
holding_codes_str = request.args.get('holding_codes', '')
holding_set = set(c.strip() for c in holding_codes_str.split(',') if c.strip())
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor(cursor_factory=RealDictCursor)
# 如果前端未指定日期,且当天无数据,自动回退到最近扫描日期
@@ -1345,19 +1329,16 @@ def get_bull_stocks():
stage: 可选,筛选特定阶段(1-5)
holdingStocks: 可选,持仓代码逗号分隔
"""
- import psycopg2
from psycopg2.extras import RealDictCursor
- from config import Config
try:
stage_filter = request.args.get('stage', type=int, default=0)
holding_str = request.args.get('holdingStocks', '')
holding_codes = set(holding_str.split(',')) if holding_str else set()
- conn = psycopg2.connect(
- host=Config.DB_HOST, port=Config.DB_PORT,
- dbname=Config.DB_NAME, user=Config.DB_USER, password=Config.DB_PASSWORD,
- )
+ conn = get_db()
+ if not conn:
+ return jsonify({'success': False, 'error': '数据库连接失败'}), 500
cur = conn.cursor(cursor_factory=RealDictCursor)
# 获取最近一次扫描数据(过滤退市/ST)