首页 文章

通过sqlalchemy和pyodbc访问MS SQL数据库时出现“登录超时已过期”错误

提问于
浏览
8

所以我在使用远程MS SQL Server进行sqlalchemy和pyodbc时遇到了一些麻烦 . 本地sqlcmd工作正常但不是当我尝试通过python代码读取数据库时 . 任何帮助,将不胜感激 .

环境:

  • Centos 7

  • SQLCmd版本:版本17.1.0000.1 Linux

  • MS SQL Server 6.01.7601.17514

  • Python 2.7

以下sqlcmd正常工作

sqlcmd -S {Host},{Port} -U {USER} -P {PWD} -Q "use {Database};"

试图直接使用sqlalchemy或pyodbc不起作用 . 错误:

pyodbc.OperationalError:('HYT00',u'[HYT00] [unixODBC] [Microsoft] [SQL Server的ODBC驱动程序17]登录超时过期(0)(SQLDriverConnect)')

代码:尝试使用pyodbc

conn = pyodbc.connect(
    r'DRIVER={ODBC Driver 17 for SQL Server};'
    r'SERVER=HOST,PORT;'
    r'DATABASE=DATABASE;'
    r'UID=UID;'
    r'PWD=PWD'
    )

尝试使用sqlalchemy:

create_engine('mssql+pyodbc://{user}:{password}@{host}:{port}/{database}?driver={driver}'.format(
        user=user,
        password=password,
        host=host,
        database=database,
        port=port,
        driver="ODBC+Driver+17+for+SQL+Server"
    )).connect()

如果我从命令中删除端口,我可以使用sqlcmd重现错误,所以我传递给pyodbc的conn_string可能格式不正确吗?

2 回答

  • 0

    问题可能与DNS有关,因为您可以阅读here .
    尝试在连接字符串中使用IP地址而不是主机名,或检查DNS配置 .

  • 0

    你的python代码做什么?问题可能是多个Connections调用 . 不要在循环中打开连接 . 或conn.close()在错误的点 . 其他问题可能是防火墙规则问题,请检查它 .

    我使用pymssql来访问我的sql server . 阅读文档并在centos系统上安装pymssql和freetds-dev . 也许你需要编辑freetds.conf并添加你的sql server的ip和port .

相关问题