2016-09-08 5 views
0

Я на CentOS, и я могу войти в свою базу данных, используя следующие:Как подключиться к Azure с помощью unixODBC и FreeTDS?

TDSVER=7.2 tsql -H example.database.windows.net -U myname -D MyDataBase -p 1433 

Тогда я положил в мой пароль и я могу войти в A-OK. К сожалению, isql/osql, похоже, гораздо труднее делать то же самое.

Моя конфигурация выглядит следующим образом:

~/.odbc.ini

[AwesomeDatabase] 
Description = Azure Awesome Database 
Trace = off 
Server = example.database.windows.net 
Database = AwesomeDatabase 
UID = [email protected] 
PWD = mypassword 
Port = 1433 
TDS Version = 7.2 
ForceTrace  = off 
Encrypt   = yes 
#Driver   = FreeTDS 
Driver   = /usr/lib64/libtdsodbc.so 
Ansi   = True 
client charset = utf-8 

Использование isql:

⚘ isql -v CDH 
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source 
[01000][unixODBC][FreeTDS][SQL Server]Unexpected EOF from the server 
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed 
[ISQL]ERROR: Could not SQLConnect 

Ну, это неудачно. Попытка osql:

⚘ osql -S AwesomeDatabase -U [email protected] -P mypassword # I've tried wayne instead of [email protected], neither works 
checking shared odbc libraries linked to isql for default directories... 
strings: '': No such file 
     trying /tmp/sql ... no 
     trying /tmp/sql ... no 
     trying /etc ... OK 
checking odbc.ini files 
     reading /home/me/.odbc.ini 
[AwesomeDatabase] found in /home/me/.odbc.ini 
found this section: 
     [AwesomeDatabase] 
     Description = Azure Awesome Database 
     Trace = off 
     Server = example.database.windows.net 
     Database = AwesomeDatabase 
     UID = [email protected] 
     PWD = mypassword 
     Port = 1433 
     TDS Version = 7.2 
     ForceTrace  = off 
     Encrypt   = yes 
     #Driver   = FreeTDS 
     Driver   = /usr/lib64/libtdsodbc.so 
     Ansi   = True 
     client charset = utf-8 
looking for driver for DSN [AwesomeDatabase] in /home/me/.odbc.ini 
    found driver line: " Driver   = /usr/lib64/libtdsodbc.so" 
    driver "/usr/lib64/libtdsodbc.so" found for [AwesomeDatabase] in .odbc.ini 
found driver named "/usr/lib64/libtdsodbc.so" 
/usr/lib64/libtdsodbc.so is an executable file 
"Server" found, not using freetds.conf 
Server is "example.database.windows.net" 

Configuration looks OK. Connection details: 

        DSN: AwesomeDatabase 
       odbc.ini: /home/me/.odbc.ini 
       Driver: /usr/lib64/libtdsodbc.so 
     Server hostname: example.database.windows.net 
       Address: 191.235.192.43 

Attempting connection as wayne ... 
+ isql CDH wayne mypassword -v 
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source 
[01000][unixODBC][FreeTDS][SQL Server]Unexpected EOF from the server 
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed 
[ISQL]ERROR: Could not SQLConnect 
net.c:202:FAILED Connecting to 191.235.192.43 port 1433 (TDS version 4.2) 

Что мне нужно сделать, чтобы подключиться к Azure с использованием UnixODBC на Linux?

ответ

0

Проблема в том, что если вы не указали имя пользователя и пароль, тогда оно рассматривается как доверенное соединение. Я не 100%, что это значит, но, очевидно, это не работает. Рабочая конфигурация на самом деле довольно проста.

[AwesomeDatabase] 
Description = Azure Awesome Database 
Server = example.database.windows.net 
Database = AwesomeDatabase 
Port = 1433 
# Note the underscore 
TDS_Version = 7.2 
# Or `FreeTDS if you want to put some settings in your 
# odbcinst.ini file 
Driver   = /usr/lib64/libtdsodbc.so 

Теперь вы должны предоставить пароль в командной строке для ISQL (не уверен, если есть способ, чтобы получить его в интерактивном режиме Там всегда xargs.):

$ isql AwesomeDatabase [email protected] mypassword # "wayne" without @example seems to work, too. 

И это будет работать хорошо. Если вы используете SQLAlchemy вы можете подключить через pyodbc так:

import sqlalchemy 
from urllib.parse import quote 

engine = sa.create_engine(
    'mssql+pyodbc://{user}:{password}@AwesomeDatabase'.format(
     user=quote('[email protected]'), 
     password=quote('mypassword'), 
    ), 
    legacy_schema_aliasing=False, 
) 

for row in engine.execute(sa.text('select current_timestamp')): 
    print(*row) 

Или, используя прямой pyodbc:

import pyodbc 

# Without the Uid/Pwd it thinks it's a Trusted Connection 
# again 
conn = pyodbc.connect('DSN=AwesomeDatabase;[email protected];Pwd=mypassword;') 
cursor = conn.cursor() 
cursor.execute('select current_timestamp'); 
for row in cursor.fetchall(): 
    print(*row) 

И теперь жизнь должна быть рада за вас.