そのため、リモートMS SQLサーバーでsqlalchemyとpyodbcを動作させるのに問題があります。ローカルのsqlcmdは適切に機能しましたが、pythonコードを介してdbを読み取ろうとしたときは機能しませんでした。助けていただければ幸いです。
環境:
次の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が正しい形式ではない可能性がありますか?
ここ を読むことができるように、問題はDNS関連である可能性があります。
接続文字列で、ホスト名ではなくIPアドレスを使用するか、DNS構成を確認してください。
pythonコードは何をしますか?問題は複数のConnections呼び出しである可能性があります。ループで接続を開かないでください。または、間違ったポイントでconn.close()を使用してください。他の問題はファイアウォールルールの問題である可能性があります、チェックしてください。
私はpymssqlを使用してSQLサーバーにアクセスします。ドキュメントを読み、pymssqlとfreetds-devをcentosシステムにインストールします。たぶん、freetds.confを編集して、SQLサーバーのIPとポートを追加する必要があります。