Linux(SLES)でpython)からMSSQLデータベースに接続しようとしています。
PyodbcとFree TDSをインストールしました。コマンドラインから:
tsql -H server -p 1433 -U username -P password
ただし、Pythonから問題なくサーバーに接続します。
import pyodbc
pyodbc.connect(driver='{FreeTDS}', server='server', database='database', uid='username', pwd='password')
エラーが発生します:
pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')
私はこのエラーを漠然としています。問題を絞り込むための提案でさえ、今は役に立ちます。
編集:TDSログダンプを見ると、次のように見えます:
token.c:328:tds_process_login_tokens()
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20017, 115)
odbc.c:2270:msgno 20017 20003
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
util.c:156:Changed query state from IDLE to DEAD
token.c:337:looking for login token, got 0()
token.c:122:tds_process_default_tokens() marker is 0()
token.c:125:leaving tds_process_default_tokens() connection dead
login.c:466:login packet accepted
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20002, 0)
odbc.c:2270:msgno 20002 20003
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
mem.c:615:tds_free_all_results()
error.c:412:odbc_errs_add: "Unable to connect to data source"
何時間もサークルに行った後、私が逃していたのは
Odbc.iniファイルのDSNのTDS_Version = 8.0。
別の場所で指定しましたが、ここにもある必要があるようです。
これが他の貧しい魂を助けることを願っています。
私は試してみます:
そしてこれは私にとってはうまくいきます:
テスト接続:
tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456
/etc/odbcinst.iniに追加:
[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1
/etc/odbc.iniに追加:
[SQLDemo]
Description=my dsn
Driver=FreeTDS
Database=teste3
Servername=SQLDemo
/etc/freetds/freetds.confに以下を追加します:
[SQLDemo]
Host = 10.19.4.42
port = 1433
tds version = 8.0
test.pyでテストします。
#!/usr/bin/python
import pyodbc
cnx = pyodbc.connect("DSN=SQLDemo;UID=DAVIDG;PWD=123456")
cursor = cnx.cursor()
cursor.execute("select * from Company;")
for row in cursor:
print row.Name
同じ問題があり、connect()
の呼び出しでTDS_Version
パラメータが欠落していることがわかりました。次のコードは、MS SQL Server 2008のインスタンスに接続するために機能します。
import pyodbc
driver = '/opt/local/lib/libtdsodbc.so' # Change this to where FreeTDS installed the driver libaray!
conn = pyodbc.connect(
driver = driver,
TDS_Version = '7.2', # Use for
server = '<hostname or ip address>',
port = 1433,
database = '<database>',
uid = '<uid>',
pwd = '<pwd>')
余分なデータポイントのために、私のホストではodbc.iniが空で、odbcinst.iniには次の行があります。
# Driver from FreeTDS
#
[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so.0
最後に、freetds.confファイルには次の行があります。
[global]
Host= <hostname>
port= <mssql port>
tds version = 8.0
確かにodbc.iniでオプション設定を指定できますが、こうすることで、構成オプションをすべて、期待する場所(freetds.confファイル)で管理できるようになります。
TDS_Versionを接続文字列に追加するとうまくいきました:
connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'
私のubuntuのバージョンを12.04にアップグレードした後、これにも問題がありました。私の古いfreetds設定/etc/freetds/freetds.conf
が見つからなかったため、/usr/local/etc
に移動する必要があり、その時点で再び機能し始めました。
また、私のドライバーの場所は/usr/local/lib/libtdsodbc.so
です
これが誰かを1日半救うことを願っています!
私の問題は、設定ファイルでホストをSQL Server IPに設定していたことですが、何時間も髪を引っ張った後、ホストをデータソース名[]に設定する必要があることに気付きました。
私の場合、そのサーバーにpingを実行すると、それがpingを実行していなかったときに、Hostファイルが見つかりません。次に、ターミナルでSudo vi/etc/hostsコマンドを適用すると、Hostファイルが見つからないことに気付きました。私は自分のホストとIPアドレスを追加し、うまくいきました。
これは私にはうまくいきました、確かではありませんが、誰かを助けるかもしれないと思いました
以下のコマンドを実行して、使用しているodbcinstおよびisqlのバージョンを確認します
which odbcinst
which isql
次に、$ odbcinst -j
を実行して、使用されているodbc.ini
およびodbcinst.ini
を見つけます。
odbcinst.ini
に追加
[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1
そしてodbc.ini
でサーバーを
[YOUR_SERVER]
Driver = FreeTDS
Servername = <YOUR_MACHINE_NAME>
Database = <Database_You_Want_To_Connect>
https://docs.snowflake.net/manuals/user-guide/odbc-linux.html#unixodbc でいくつかの良い説明を見つけました
https://github.com/lionheart/Django-pyodbc/wiki/Mac-setup-to-connect-to-a-MS-SQL-Server もご覧ください。
1つの設定はenoug、/etc/odbcinst.ini
です。
[FreeTDS]
Description = FreeTDS Driver to MsSQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
UsageCount = 1
そして次:
connection = pyodbc.connect(
'DRIVER=FreeTDS;'
'SERVER=<Host_name_or_ip>;'
'PORT=1433;'
'DATABASE=<database>;'
'UID=<username>;'
'PWD=<password>;'
'TDS_VERSION=8.0;'
)
pythonスクリプトで環境変数を設定することもできます:
os.environ['TDSVER'] = '8.0'