宅吉便


在Linux上使用SQLAlchemy連線到Microsoft SQL Server

SQL Server SQLAlchemy pymssql pyodbc python

由於在工作上我的作業系統是Linux
而合作的對象是使用Microsoft SQL Server
且我需要透過 SQLAlchemy 來連線

如何建立起Linux跟Windows的橋樑呢?
以下是完整的說明:


安裝 Microsoft ODBC Driver

在Linux上面安裝Microsoft ODBC Driver的部份
Microsoft官方網頁有提供完整指令
不管你是使用Debian, Ubuntu, OSX...
其實主要無腦的複製貼上
基本上就完成了

我這邊用Debian8作為範例

sudo su 
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list

apt-get update
ACCEPT_EULA=Y apt-get -y install msodbcsql

apt-get -y install unixodbc-dev freetds-dev

安裝完畢以後
/etc/unixODBC 下面可以看到一個自動產生的 odbcinst.ini
內容大致如下:

[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.1.0
Threading=1
UsageCount=1

其中
ODBC Driver 13 for SQL Server 就是Driver的名稱
Driver= 後面的那一串
就是 driver的位置


安裝 SQLAlchemy

除了安裝 sqlalchemy 之外,我們也同時要安裝 pymssql 以及 pyodbc:

pip install sqlalchemy pymssql pyodbc

這樣就完成了所有安裝的部份


透過SQLAlchemy連接SQL Server

在連線上
我們可以直接透過 DSN 進行連線
也可以直接指定 Hostname
分別如下:

DSN-based Connections

首先我們要先定義一個DSN
編輯 /etc/odbc.ini

[your_dsn_name]
Driver=ODBC Driver 13 for SQL Server  # 這邊的名稱請與 `/etc/unixODBC/odbcinst.ini` 裡面的設定一致
Description=這邊打什麼不重要,就只是一個簡單給人看的描述                                                                                                                                 
Trace=Yes
Server=db的ip
Port=db的port #預設是1433
Database=db的名字  # 如果沒有要指定特定db,這一行也可以省略

然後就可以透過以下的方式連線:

from sqlalchemy import create_engine

engine = create_engine(
    'mssql+pyodbc://user:password@you_dsn_name'
)


Hostname Connections

使用此方法
需要明確的提供ODBC Driver的絕對路徑, 此部份已經在上述提及

以下提供連線範例:

from sqlalchemy import create_engine

engine = create_engine(
    'mssql+pyodbc://username:password@host:port/database'
    'driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.8.0'
)

或者你也可以直接指定ODBC Driver的名稱 ,如下:

engine = create_engine(
    'mssql+pyodbc://username:password@host:port/database'
    'driver=ODBC+Driver+13+for+SQL+Server'
)

來測試一下是否有連線成功:

# See who's connecting
list(engine.execute('sp_who'))

可能遇到的狀況

如果在安裝 msodbcsql 如果有碰到問題的話
可以先檢查一下 /etc/odbc.ini 是否存在
如果是的話,代表之前可能有先裝過其他版本的
建議先備份起來並移動它其他地方
然後在重新安裝一次,應該就可以解決了~