From efce85f4f90da181a968cbdf78991ea5ce711de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=B7=E5=B0=8F=E5=89=8D?= Date: Sun, 18 Jan 2026 18:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0ios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 95 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/app.py b/app.py index 85709c1c..2f4b1349 100755 --- a/app.py +++ b/app.py @@ -8432,46 +8432,69 @@ def get_clickhouse_client(): return _clickhouse_client -# ==================== 高频五档数据 ClickHouse 连接池(222.128.1.157) ==================== -_realtime_clickhouse_client = None -_realtime_clickhouse_client_lock = threading.Lock() +# ==================== 高频五档数据 ClickHouse HTTP 客户端(222.128.1.157:18123) ==================== +class RealtimeClickHouseHTTP: + """ + 使用 HTTP 协议连接 ClickHouse(端口 18123) + 因为 222.128.1.157 只开放了 HTTP 端口,未开放原生协议端口 9000 + """ + def __init__(self, host='222.128.1.157', port=18123, user='default', password='Zzl33818!', database='stock'): + self.base_url = f'http://{host}:{port}' + self.user = user + self.password = password + self.database = database -def _create_realtime_clickhouse_client(): - """创建高频五档数据 ClickHouse 客户端连接(222.128.1.157)""" - return Cclient( - host='222.128.1.157', - port=9000, # 原生协议端口(非 HTTP 18123) - user='default', - password='Zzl33818!', - database='stock', - settings={ - 'connect_timeout': 10, - 'send_receive_timeout': 60, - } - ) - -def get_realtime_clickhouse_client(): - """获取高频五档数据 ClickHouse 客户端(带健康检查和自动重连)""" - global _realtime_clickhouse_client - - with _realtime_clickhouse_client_lock: - if _realtime_clickhouse_client is None: - _realtime_clickhouse_client = _create_realtime_clickhouse_client() - print("[ClickHouse-Realtime] 创建新连接 (222.128.1.157)") - return _realtime_clickhouse_client + def execute(self, query, params=None): + """执行 SQL 查询,返回结果列表""" + # 替换参数占位符 + if params: + for key, value in params.items(): + placeholder = f'%({key})s' + if isinstance(value, str): + query = query.replace(placeholder, f"'{value}'") + elif isinstance(value, (list, tuple)): + # 列表参数 + if all(isinstance(v, str) for v in value): + values_str = ', '.join(f"'{v}'" for v in value) + else: + values_str = ', '.join(str(v) for v in value) + query = query.replace(placeholder, f"({values_str})") + elif isinstance(value, date): + query = query.replace(placeholder, f"'{value.isoformat()}'") + else: + query = query.replace(placeholder, str(value)) try: - _realtime_clickhouse_client.execute("SELECT 1") - except Exception as e: - print(f"[ClickHouse-Realtime] 连接失效,正在重连: {e}") - try: - _realtime_clickhouse_client.disconnect() - except Exception: - pass - _realtime_clickhouse_client = _create_realtime_clickhouse_client() - print("[ClickHouse-Realtime] 重连成功") + response = requests.post( + self.base_url, + params={ + 'database': self.database, + 'user': self.user, + 'password': self.password, + 'default_format': 'JSONCompact', + }, + data=query.encode('utf-8'), + timeout=30, + ) + response.raise_for_status() - return _realtime_clickhouse_client + if response.text.strip(): + result = response.json() + return result.get('data', []) + return [] + except requests.exceptions.RequestException as e: + print(f"[ClickHouse-HTTP] 请求失败: {e}") + raise + +_realtime_clickhouse_http = None + +def get_realtime_clickhouse_client(): + """获取高频五档数据 ClickHouse HTTP 客户端""" + global _realtime_clickhouse_http + if _realtime_clickhouse_http is None: + _realtime_clickhouse_http = RealtimeClickHouseHTTP() + print("[ClickHouse-HTTP] 创建 HTTP 客户端 (222.128.1.157:18123)") + return _realtime_clickhouse_http @app.route('/api/account/calendar/events', methods=['GET', 'POST'])