Резюме
Използвам Mac на Yosemite версия 10.10.1, опитвайки се да се свържа с база данни на MS SQL Server. Търсих и не можах да намеря актуализиран подробен отговор, така че ето описание, което е предимно от тази невероятна статия тук . Добавям го в stackoverflow, в случай че връзката умре. Идеята е, че ще имаме следните слоеве за настройка/свързване.
Слоеве
- ЧАСТ 1 - pyodbc
- ЧАСТ 2 - freeTDS (може да се провери с tsql)
- ЧАСТ 3 - unixODBC (може да се провери с isql)
- ЧАСТ 4 - MS SQL (може да се провери с обикновена програма на Python)
Стъпки
-
Инсталирайте Homebrew от тук - това е мениджър на пакети за Mac OSX. Статията показва как да използвате друг мениджър на пакети „MacPorts“. За моя инструкция са с homebrew. По принцип homebrew има папка 'cellar', която съдържа различни версии на пакети. Вместо да променя нормалните ви файлове, той сочи към тези homebrew пакети.
-
Трябва да инсталираме Pyodbc, но pyodbc използва iODBC драйвери по подразбиране (които идват инсталирани с mac), но много хора имат проблеми с работата му. Така че ще използваме алтернатива, наречена
unixodbc
, които бихме инсталирали в бъдеще. Засега трябва да конфигурираме инсталацията на pyodbc така, че да работи с unixodbc.
Отидете на PyPi и изтеглете pyodbc tarball и го декомпресирайте. След това променете тези редове в setup.py
:
elif sys.platform == 'darwin':
# OS/X now ships with iODBC.
settings['libraries'].append('iodbc')
до:
elif sys.platform == 'darwin':
# OS/X now ships with iODBC.
settings['libraries'].append('odbc')
и сега стартирайте python setup.py install
.
Това кара нашата инсталация на pyodbc да използва unixodbc драйвери по подразбиране. Перфектно!
-
Инсталирайте FreeTDS с
brew install freetds --with-unixodbc
(FreeTDS е драйверът, който се намира между Mac ODBC и MS SQL Server, това диаграмата тук показва коя версия на TDS трябва да използвате въз основа на вашата конкретна версия на Microsoft Server; напр. tds протокол 7.2 за Microsoft SQL Server 2008). -
Конфигурирайте
freetds.conf
файл (Файлът трябва да е в „/usr/local/etc/freetds.conf“, което за Homebrew е връзка, която казва „/usr/local/Cellar/freetds/0.91_2/etc“, но вашият може да е на друго място в зависимост от версията). Редактирах глобалната и добавих информацията за моята база данни в края (по някаква причина 'tds версия =7.2' ще даде грешка, но все още работи, докато 8.0 просто работи):[global] # TDS protocol version tds version = 8.0 [MYSERVER] host = MYSERVER port = 1433 tds version = 8.0
-
Проверете инсталирането на FreeTDS правилно с:
tsql -S myserver -U myuser -P mypassword
(трябва да видите подкана като тази, ако работи)locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 1>
-
Инсталирайте unixODBC с
brew install unixodbc
. -
Настройте своите конфигурационни файлове за unixODBC , което включва odbcinst.ini (конфигурация на драйвер) и odbc.ini (DSN конфигурационен файл). По подразбиране моите файлове бяха в:
/Library/ODBC
(Забележка:НЕ е моята потребителска библиотека, известна още като /Users/williamliu/Library). Или те също могат да бъдат във вашата homebrew инсталационна директория/usr/local/Cellar/unixodbc/<version>/etc
. -
Отворете вашия 'odbcinst.ini ' файл и след това добавете следното (Забележка:Различно, ако използвате MacPorts. За Homebrew този файл е връзка към версията homebrew, напр. моята е в '/usr/local/Cellar/freetds/0.91_2/lib/libtdsodbc.so '):
[FreeTDS] Description=FreeTDS Driver for Linux & MSSQL on Win32 Driver=/usr/local/lib/libtdsodbc.so Setup=/usr/local/lib/libtdsodbc.so UsageCount=1
-
Отворете вашия 'odbc.ini ' и след това добавете следното (това обикновено е заедно с
odbcinst.ini
:[MYSERVER] Description = Test to SQLServer Driver = FreeTDS Trace = Yes TraceFile = /tmp/sql.log Database = MYDATABASE Servername = MYSERVER UserName = MYUSER Password = MYPASSWORD Port = 1433 Protocol = 8.0 ReadOnly = No RowVersioning = No ShowSystemTables = No ShowOidColumn = No FakeOidIndex = No
-
Потвърдете unixODBC инсталиран правилно с:
isql MYSERVER MYUSER MYPASSWORD
. Ако получите грешка, че не можете да се свържете, добавете-v
за да проверите какъв е подробният изход и да го поправите. В противен случай трябва да видите това:+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+
-
Сега проверете дали pyodbc работи с програма на python. Стартирайте python в обвивката или .py файл с това и трябва да получите заявката си обратно:
import pyodbc import pandas import pandas.io.sql as psql cnxn = pyodbc.connect('DSN=MYSERVER;UID=MYUSER;PWD=MYPASSWORD') cursor = cnxn.cursor() sql = ("SELECT * FROM dbo.MYDATABASE") df = psql.frame_query(sql, cnxn)
Можете да се обърнете към документацията на pyodbc, за да получите повече помощ след това.