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文件加载的。
具体步骤
安装
python-dotenv包
在激活的虚拟环境中执行命令:pip install python-dotenv在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')确保.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"替换硬编码的连接字符串
取消注释环境变量取值的代码,注释掉硬编码的字符串:# 这样写能正常工作: # 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
相关产品推荐
相关产品推荐

