You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用读取环境变量数据库连接串触发AttributeError问题排查

问题:Flask应用中读取环境变量后SQLAlchemy报AttributeError错误

我跟着教程开发了一个简单的Flask应用,正尝试将数据库凭证从代码转移到环境变量中。已在应用根目录的.env文件中定义了DB_CONNECTION_STR,以下是database.py文件的顶部代码。本应是简单修复,可能我遗漏了明显的拼写错误。

from sqlalchemy import create_engine, text
import os

DB_CONNECTION_STR = os.environ.get('DB_CONNECTION_STR')

# 这两行都能打印出正确值:
print(DB_CONNECTION_STR)
print(os.environ.get('DB_CONNECTION_STR'))

# 这样写能正常工作:
db_connection_string = "mysql+pymysql://ehcazu8mvtvv4i44ghs3:pscale_pw_i960dmnsHwOCf3IWmKZi4AzOMVi1ZueGLYRiPZAy3i9@aws.connect.psdb.cloud/joviancareers?charset=utf8mb4"

# 尝试以下任意一种写法都会触发“AttributeError: 'NoneType' object has no attribute '_instantiate_plugins'”
# db_connection_string = DB_CONNECTION_STR
# db_connection_string = os.environ.get('DB_CONNECTION_STR')

engine = create_engine(db_connection_string, connect_args={
  "ssl": {
    "ca": "/etc/ssl/certs/ca-certificates.crt"
  }
})

遇到的错误如下:

Traceback (most recent call last):
  File "/home/taylor/src/jovian-carrers/app.py", line 2, in <module>
    from database import load_jobs
  File "/home/taylor/src/jovian-carrers/database.py", line 17, in <module>
    engine = create_engine(db_connection_string,
  File "<string>", line 2, in create_engine
  File "/home/taylor/src/jovian-carrers/venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 298, in warned
    return fn(*args, **kwargs)
  File "/home/taylor/src/jovian-carrers/venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 518, in create_engine
    u, plugins, kwargs = u._instantiate_plugins(kwargs)
AttributeError: 'NoneType' object has no attribute '_instantiate_plugins'

解决方法

核心原因

Python的os.environ默认不会自动读取项目根目录的.env文件,所以你调用os.environ.get('DB_CONNECTION_STR')实际返回的是None,将None传入create_engine就会触发这个错误。你打印时看到正确值,大概率是手动在终端设置过该环境变量,而非从.env文件加载的。

具体步骤

  1. 安装python-dotenv包
    在激活的虚拟环境中执行命令:

    pip install python-dotenv
    
  2. 在database.py中加载.env文件
    在文件开头导入并调用load_dotenv():

    from sqlalchemy import create_engine, text
    import os
    from dotenv import load_dotenv
    
    # 加载根目录的.env文件
    load_dotenv()
    
    DB_CONNECTION_STR = os.environ.get('DB_CONNECTION_STR')
    
  3. 确保.env文件格式正确
    检查.env文件里的变量定义,不要加多余空格,格式如下:

    DB_CONNECTION_STR=mysql+pymysql://ehcazu8mvtvv4i44ghs3:pscale_pw_i960dmnsHwOCf3IWmKZi4AzOMVi1ZueGLYRiPZAy3i9@aws.connect.psdb.cloud/joviancareers?charset=utf8mb4
    

    如果连接字符串包含特殊字符,可用双引号包裹:

    DB_CONNECTION_STR="mysql+pymysql://your-user:your-pass@host/db?params"
    
  4. 替换硬编码的连接字符串
    取消注释环境变量取值的代码,注释掉硬编码的字符串:

    # 这样写能正常工作:
    # db_connection_string = "mysql+pymysql://ehcazu8mvtvv4i44ghs3:pscale_pw_i960dmnsHwOCf3IWmKZi4AzOMVi1ZueGLYRiPZAy3i9@aws.connect.psdb.cloud/joviancareers?charset=utf8mb4"
    
    # 使用环境变量取值
    db_connection_string = DB_CONNECTION_STR
    

完成以上步骤后,重新启动应用,os.environ就能正确读取到.env文件中的数据库连接字符串,create_engine也能正常创建引擎了。

内容的提问来源于stack exchange,提问作者Taylor Huston

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:57:10