From 7612bae51e981526dac3dada2209301582816ca9 Mon Sep 17 00:00:00 2001 From: shellway-pc <413209390@qq.com> Date: Fri, 31 Jul 2026 22:13:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E4=BA=86=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E4=B8=AD=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=B4=A6=E6=88=B7=E5=AF=86=E7=A0=81=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E5=AF=BC=E5=85=A5=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E3=80=82=E5=A2=9E=E5=8A=A0=E7=9B=B8=E5=85=B3=E4=BE=9D=E8=B5=96?= =?UTF-8?q?python-dotenv>=3D1.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quantitative_data/config.py | 23 +++++++++++++++++++++-- quantitative_data/importer.py | 4 ++-- quantitative_data/requirements.txt | 3 ++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/quantitative_data/config.py b/quantitative_data/config.py index ebd7975..a5cbf68 100644 --- a/quantitative_data/config.py +++ b/quantitative_data/config.py @@ -8,19 +8,38 @@ 设置方式: Windows: set QUANT_DB_PASSWORD=your_password && set TUSHARE_TOKEN=your_token Linux: export QUANT_DB_PASSWORD=your_password && export TUSHARE_TOKEN=your_token - 也可创建 .env 文件(参考 .env.example) + 也可创建 .env 文件(参考 .env.example) """ import os +from pathlib import Path +from urllib.parse import quote_plus + +# 加载 .env 文件中的环境变量 +try: + from dotenv import load_dotenv + env_path = Path(__file__).parent / ".env" + if env_path.exists(): + load_dotenv(dotenv_path=env_path, override=True) + print(f"✓ 已加载环境变量文件: {env_path}") + else: + print(f"⚠ 未找到 .env 文件: {env_path}") +except ImportError: + print("⚠ python-dotenv 未安装,无法自动加载 .env 文件。请手动设置环境变量或执行: pip install python-dotenv") # PostgreSQL Docker 连接配置 +_PASSWORD = os.environ.get("QUANT_DB_PASSWORD", "") + DB_CONFIG = { "host": os.environ.get("QUANT_DB_HOST", "192.168.27.11"), "port": int(os.environ.get("QUANT_DB_PORT", "5438")), "database": os.environ.get("QUANT_DB_NAME", "quant_db"), "user": os.environ.get("QUANT_DB_USER", "postgres"), - "password": os.environ.get("QUANT_DB_PASSWORD", ""), + "password": _PASSWORD, } +# 对密码进行 URL 编码(用于 SQLAlchemy 连接串),避免特殊字符导致解析错误 +PASSWORD_ENCODED = quote_plus(_PASSWORD) if _PASSWORD else "" + # Tushare API Token TUSHARE_TOKEN = os.environ.get("TUSHARE_TOKEN", "") diff --git a/quantitative_data/importer.py b/quantitative_data/importer.py index 21cc1bb..a6aab08 100644 --- a/quantitative_data/importer.py +++ b/quantitative_data/importer.py @@ -15,7 +15,7 @@ from psycopg2 import sql from psycopg2.extras import execute_values from sqlalchemy import create_engine -from config import DB_CONFIG, TUSHARE_TOKEN, BATCH_SIZE, START_DATE, END_DATE +from config import DB_CONFIG, TUSHARE_TOKEN, BATCH_SIZE, START_DATE, END_DATE, PASSWORD_ENCODED # ============================================================ # 日志配置 @@ -55,7 +55,7 @@ def get_sqlalchemy_engine(): global _sqlalchemy_engine if _sqlalchemy_engine is None: db_url = ( - f"postgresql://{DB_CONFIG['user']}:{DB_CONFIG['password']}" + f"postgresql://{DB_CONFIG['user']}:{PASSWORD_ENCODED}" f"@{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}" ) _sqlalchemy_engine = create_engine(db_url, pool_size=5, max_overflow=10) diff --git a/quantitative_data/requirements.txt b/quantitative_data/requirements.txt index d8b1d64..54d195d 100644 --- a/quantitative_data/requirements.txt +++ b/quantitative_data/requirements.txt @@ -1,4 +1,5 @@ tushare>=1.4.0 pandas>=1.5.0 psycopg2-binary>=2.9.0 -sqlalchemy>=2.0.0 \ No newline at end of file +sqlalchemy>=2.0.0 +python-dotenv>=1.0.0