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

时间:2018-06-22 21:59:33

标签: sql-server sqlalchemy pyodbc sqlcmd

所以我很难让sqlalchemy和pyodbc与远程MS SQL Server一起工作。本地sqlcmd正常工作,但是当我尝试通过python代码读取数据库时无法正常工作。任何帮助,将不胜感激。

环境:

  • Centos 7
  • SQLCmd版本:Linux 17.1.0000.1版
  • 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 :(得分:1)

就我而言,这发生在我没有正确转义具有特殊字符的密码时。这是我的解决方案:

from urllib.parse import quote
...
passwd = 'p@ssw0rd!'
...
engine_string = f"mssql+pyodbc://{user}:{quote(passwd)}@{host}/{name}?driver=ODBC+Driver+17+for+SQL+Server"

答案 1 :(得分:0)

您的python代码有什么作用?问题可能是多个Connections调用。不要循环打开连接。或conn.close()在错误的位置。 另一个问题可能是防火墙规则问题,请检查它。

我使用pymssql访问我的sql服务器。阅读文档,然后在centos系统上安装pymssql和freetds-dev。也许您需要编辑freetds.conf并添加sql服务器的IP和端口。