Sqlalchemy启动报错:invalid literal for int() with base 10: 'None' 求助
问题排查:Sqlalchemy连接PostgreSQL时触发ValueError
运行Python代码连接PostgreSQL数据库时,触发Sqlalchemy错误:ValueError: invalid literal for int() with base 10: 'None',作为ORM新手无法定位问题,以下是代码及完整报错栈:
数据库连接代码
import os from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from dotenv import load_dotenv load_dotenv('.env') #MOben DB moben_db_creds = { 'host' : os.getenv('POSTGRES_MOBEN_HOST'), 'port' : os.getenv('POSTGRES_MOBEN_PORT'), 'user' : os.getenv('POSTGRES_MOBEN_USER'), 'password' : os.getenv('POSTGRES_MOBEN_DBPASS'), 'name' : os.getenv('POSTGRES_MOBEN_DBNAME'), 'type' : os.getenv('POSTGRES_MOBEN_DBTYPE') } sqlalchemy_db_uri_conn = f"{moben_db_creds['type']}://{moben_db_creds['user']}:{moben_db_creds['password']}@{moben_db_creds['host']}:{moben_db_creds['port']}/{moben_db_creds['name']}" # DEFINE THE ENGINE (CONNECTION OBJECT) engine = create_engine(sqlalchemy_db_uri_conn) # CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE session = sessionmaker(autocommit=False, autoflush=False, bind=engine) base = declarative_base() def get_db(): db = session() try: yield db finally: db.close()
完整报错栈
(env_ucom_csb) PS C:\Users\e008329\Downloads\project_zone\ucom-csb-payload-publisher> uvicorn main:app --reload INFO: Will watch for changes in these directories: ['C:\\Users\\e008329\\Downloads\\project_zone\\ucom-csb-payload-publisher'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [27160] using WatchFiles Process SpawnProcess-1: Traceback (most recent call last): File "C:\Users\e008329\AppData\Local\Programs\Python\Python38\lib\multiprocessing\process.py", line 315, in _bootstrap self.run() File "C:\Users\e008329\AppData\Local\Programs\Python\Python38\lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\uvicorn\_subprocess.py", line 76, in subprocess_started target(sockets=sockets) File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\uvicorn\server.py", line 60, in run return asyncio.run(self.serve(sockets=sockets)) File "C:\Users\e008329\AppData\Local\Programs\Python\Python38\lib\asyncio\runners.py", line 44, in run return loop.run_until_complete(main) File "C:\Users\e008329\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 616, in run_until_complete return future.result() File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\uvicorn\server.py", line 67, in serve config.load() File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\uvicorn\config.py", line 477, in load self.loaded_app = import_from_string(self.app) File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string module = importlib.import_module(module_str) File "C:\Users\e008329\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 848, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "C:\Users\e008329\Downloads\project_zone\ucom-csb-payload-publisher\.\main.py", line 3, in <module> from publish_ucom_csb import publish_uci_all File "C:\Users\e008329\Downloads\project_zone\ucom-csb-payload-publisher\.\publish_ucom_csb.py", line 2, in <module> from models.v_payload_ucom_csb import VPayloadUCOMCsb File "C:\Users\e008329\Downloads\project_zone\ucom-csb-payload-publisher\.\models\v_payload_ucom_csb.py", line 2, in <module> from config.database import base File "C:\Users\e008329\Downloads\project_zone\ucom-csb-payload-publisher\.\config\database.py", line 31, in <module> engine = create_engine(sqlalchemy_db_uri_conn) File "<string>", line 2, in create_engine File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\sqlalchemy\util\deprecations.py", line 277, in warned return fn(*args, **kwargs) # type: ignore[no-any-return] File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\sqlalchemy\engine\create.py", line 552, in create_engine u = _url.make_url(url) File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\sqlalchemy\engine\url.py", line 838, in make_url return _parse_url(name_or_url) File "c:\users\e008329\downloads\project_zone\env_ucom_csb\lib\site-packages\sqlalchemy\engine\url.py", line 893, in _parse_url components["port"] = int(components["port"]) ValueError: invalid literal for int() with base 10: 'None'
问题根源与解决方法
核心原因
报错栈明确指向components["port"] = int(components["port"]),说明Sqlalchemy尝试把字符串'None'转换为整数失败。这是因为os.getenv('POSTGRES_MOBEN_PORT')没有读取到环境变量,返回了None,拼接URL后端口部分变成了'None'。
排查步骤
- 检查
.env文件:确认其中存在POSTGRES_MOBEN_PORT字段,且值为有效的数字(比如PostgreSQL默认端口5432) - 验证路径:确保
load_dotenv('.env')加载的是正确的文件,若.env不在脚本执行的当前目录,改用绝对路径,比如load_dotenv(os.path.join(os.path.dirname(__file__), '.env')) - 打印变量:在代码中添加
print(moben_db_creds['port']),执行脚本查看输出是否为预期的端口号,确认环境变量是否加载成功
修复方案
方案1:确保环境变量配置正确
在.env文件中添加或修正:
POSTGRES_MOBEN_PORT=5432
方案2:给环境变量设置默认值
修改代码中获取端口的语句,即使变量不存在也用默认端口:
'port' : os.getenv('POSTGRES_MOBEN_PORT', 5432),
方案3:添加参数校验
在拼接URL前检查端口是否有效,提前抛出明确错误:
if moben_db_creds['port'] is None: raise ValueError("请配置POSTGRES_MOBEN_PORT环境变量") # 或者同时转成整数 moben_db_creds['port'] = int(moben_db_creds['port']) if moben_db_creds['port'] else 5432
内容的提问来源于stack exchange,提问作者abinash thakur
相关产品推荐
相关产品推荐

