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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:34:51