web-dev-qa-db-ja.com

sqlalchemyおよびpyodbcを介してMS SQL dbにアクセスすると、「ログインタイムアウトの期限が切れました」エラー

そのため、リモートMS SQLサーバーでsqlalchemyとpyodbcを動作させるのに問題があります。ローカルのsqlcmdは適切に機能しましたが、pythonコードを介してdbを読み取ろうとしたときは機能しませんでした。助けていただければ幸いです。

環境:

  • 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] [ODBC Driver 17 for SQL Server] Login timeout expired(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が正しい形式ではない可能性がありますか?

8
ttback

ここ を読むことができるように、問題はDNS関連である可能性があります。
接続文字列で、ホスト名ではなくIPアドレスを使用するか、DNS構成を確認してください。

0
user10224608

pythonコードは何をしますか?問題は複数のConnections呼び出しである可能性があります。ループで接続を開かないでください。または、間違ったポイントでconn.close()を使用してください。他の問題はファイアウォールルールの問題である可能性があります、チェックしてください。

私はpymssqlを使用してSQLサーバーにアクセスします。ドキュメントを読み、pymssqlとfreetds-devをcentosシステムにインストールします。たぶん、freetds.confを編集して、SQLサーバーのIPとポートを追加する必要があります。

0
Daniel