Streamlit部署环境无法连接SQL数据库问题求助
问题描述
基于LlamaIndex开发NLP应用,本地执行streamlit run app.py时代码正常运行,但部署到Streamlit平台后,在metadata_obj.create_all(database_engine)行持续报错,核心错误为SQL Server登录超时。
核心代码片段
import time, os, pinecone as p, streamlit as st, sqlalchemy as sa, pandas as pd, numpy as np, pyodbc from sqlalchemy import Select, Column, VARCHAR, Table, create_engine, MetaData, inspect from llama_index.llms import LlamaCPP from langchain.chat_models import ChatOpenAI from llama_index import VectorStoreIndex, SQLDatabase from llama_index.indices.struct_store import SQLTableRetrieverQueryEngine from Secrets import OPENAI_API_KEY, PINECONE_API_KEY, SERVER, DATABASE, TABLES_CONN_STR @st.cache_resource() def getConnection(key): if key == 'tables': from Secrets import TABLES_CONN_STR tables_engine = create_engine(TABLES_CONN_STR) return tables_engine if key == 'data': db_conn_string = 'mssql+pyodbc://@' + SERVER + '/' + DATABASE + '?trusted_connection=yes&driver=ODBC+Driver+17+for+SQL+Server' database_engine = create_engine(db_conn_string, pool_pre_ping=True) return database_engine def refreshSQLDatabase(): database_engine = getConnection('data') #LOAD TABLE DEFINITIONS metadata_obj = MetaData() metadata_obj.create_all(database_engine) #ESTABLISH CONNECTION TO OUR DATABASE table_list = getTableNames() sql_database = SQLDatabase(database_engine, metadata=metadata_obj, include_tables=table_list, sample_rows_in_table_info=3) return sql_database
错误信息
sqlalchemy.exc.OperationalError: This app has encountered an error. The original error message is redacted to prevent data leaks. Full error details have been recorded in the logs
关键报错栈
pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
排查与解决方案
1. 网络连通性排查
Streamlit云服务器无法访问公司内部SQL Server是最常见原因:
- 检查数据库服务器防火墙规则,确认是否允许Streamlit云的IP段访问;若为内部数据库,需通过VPN、代理或配置公网访问(配合严格权限控制)。
- 若使用云数据库(如Azure SQL、AWS RDS),确认已开启公网访问权限,且Streamlit服务器IP已加入数据库白名单。
2. 身份验证方式调整
代码中使用trusted_connection=yes(Windows域身份验证),但Streamlit云运行在Linux环境下,无法支持该验证方式:
- 切换为SQL Server身份验证,修改连接字符串:
db_conn_string = 'mssql+pyodbc://{USERNAME}:{PASSWORD}@{SERVER}/{DATABASE}?driver=ODBC+Driver+17+for+SQL+Server' - 通过Streamlit Secrets管理
USERNAME和PASSWORD,禁止硬编码敏感信息。
3. 连接字符串优化
- 确保
SERVER变量包含完整地址(如tcp:servername,port),非默认端口必须明确指定。 - 使用
f-string格式化连接字符串,避免拼接错误:db_conn_string = f'mssql+pyodbc://{USERNAME}:{PASSWORD}@{SERVER}/{DATABASE}?driver=ODBC+Driver+17+for+SQL+Server'
4. 超时与连接池配置
- 在
create_engine中添加超时参数,延长连接等待时间:database_engine = create_engine(db_conn_string, pool_pre_ping=True, connect_args={'timeout': 30})
5. 依赖与驱动检查
- 在
requirements.txt中明确添加pyodbc,确保Streamlit云环境安装正确依赖。
内容的提问来源于stack exchange,提问作者Jimmy Sgrazzutti
相关产品推荐
相关产品推荐

