Что вызывает «неспособность подключиться к источнику данных» для pyodbc?
Я пытаюсь подключиться к базе данных MSSQL из python в Linux (SLES).
Я установил 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"
- Это занимает много времени … как ускорить этот словарь? (Python)
- Как бы вы смоделировали эту связь с базой данных?
- Как сопоставить один класс с несколькими таблицами с SQLAlchemy?
- Монго связи / ссылки: наиболее эффективный способ? Примеры?
- SqlAlchemy IntegrityError
Я стараюсь:
- MS SQL 2008 Datacenter
- Ubuntu 12.04 TLS (amd64)
- Python 2.7
И это работает для меня:
Тестовое соединение:
tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456
on /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
on /etc/odbc.ini добавить:
[SQLDemo] Description=my dsn Driver=FreeTDS Database=teste3 Servername=SQLDemo
on /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
После нескольких часов в кругах выясняется, что все, что мне не хватало, было
TDS_Version = 8.0 в DSN в моем файле odbc.ini.
Я указал его в другом месте, но он тоже должен был быть здесь.
Надеюсь, это поможет другой плохой душе.
У меня была та же проблема, и я узнал, что в вызове 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>')
Только для дополнительного datapoint 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 config /etc/freetds/freetds.conf
не был найден, поэтому мне пришлось переместить его в /usr/local/etc
после чего он снова начал работать.
Также мое местоположение водителя – /usr/local/lib/libtdsodbc.so
Надеюсь, это поможет спасти кого-то полтора года!
Моя проблема заключалась в том, что в моем файле настроек я устанавливал HOST на IP-адрес SQL Server, однако после нескольких часов вытягивания волос я понял, что HOST должен быть установлен на имя источника данных []
Следующее работало на меня:
Изменить python2.7/site-packages/sql_server/pyodbc/base.py
def get_new_connection(self, conn_params): ... - cstr_parts['SERVERNAME'] = host + cstr_parts['SERVER'] = host + cstr_parts['PORT'] = str(port)
- Отношение «один ко многим» SQLAlchemy, которые зависят друг от друга
- Очистка вложенных операторов re.sub
- Зависимость круговой модели Django
- MongoDB Оптимизация FindAndModify или Найти + Сортировать
- Как создать веб-страницу для поиска в базе данных mongoDB?
- Список пользователей для определенной базы данных с помощью PyMongo
- Использование других базовых систем в SymPy
- Структура данных для базы данных текстовых материалов
- Как обновить Mongo-документ после его вставки?