web-dev-qa-db-ja.com

pyodbcの「データソースに接続できません」の原因は何ですか?

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"
25
pbaehr

何時間もサークルに行った後、私が逃していたのは

Odbc.iniファイルのDSNのTDS_Version = 8.0。

別の場所で指定しましたが、ここにもある必要があるようです。

これが他の貧しい魂を助けることを願っています。

10
pbaehr

私は試してみます:

  • MS SQL 2008データセンター
  • Ubuntu 12.04 TLS(AMD64)
  • Python 2.7

そしてこれは私にとってはうまくいきます:

テスト接続:

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
19
José Ibañez

同じ問題があり、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>')
13
Feuermurmel

余分なデータポイントのために、私のホストでは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ファイル)で管理できるようになります。

4

TDS_Versionを接続文字列に追加するとうまくいきました:

connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'

3
cadizm

私のubuntuのバージョンを12.04にアップグレードした後、これにも問題がありました。私の古いfreetds設定/etc/freetds/freetds.confが見つからなかったため、/usr/local/etcに移動する必要があり、その時点で再び機能し始めました。

また、私のドライバーの場所は/usr/local/lib/libtdsodbc.soです

これが誰かを1日半救うことを願っています!

2
Ben Ford

私の問題は、設定ファイルでホストをSQL Server IPに設定していたことですが、何時間も髪を引っ張った後、ホストをデータソース名[]に設定する必要があることに気付きました。

2
Andres

私の場合、そのサーバーにpingを実行すると、それがpingを実行していなかったときに、Hostファイルが見つかりません。次に、ターミナルでSudo vi/etc/hostsコマンドを適用すると、Hostファイルが見つからないことに気付きました。私は自分のホストとIPアドレスを追加し、うまくいきました。

1
saichand

これは私にはうまくいきました、確かではありませんが、誰かを助けるかもしれないと思いました

以下のコマンドを実行して、使用している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 もご覧ください。

0
user8615558

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;'
)
0
Vadim

pythonスクリプトで環境変数を設定することもできます:

os.environ['TDSVER'] = '8.0'
0
Pathead