MacからDockerに作ってあるSQL Serverへのpython使っての接続が急にできなくなってしまったので、その時の解決策をメモしておく。
#環境前提
- jupyter notebookからpyodbc,sqlalchemyを用いた接続。sqlalchemyの接続文字列や使い方は下記がとてもわかりやすかったので参照。
- FreeTDSとかODBCドライバーをインストールしている。ODBCドライバーは下記URL参照
#ぶち当たったこと
jupyter notebookからSQL Serverにつなぎに行こうと下記コード実行。
import sqlalchemy
import pyodbc
engine = sqlalchemy.create_engine("mssql+pyodbc://ユーザ名:パスワード@データソース名(DSN)")
connection = engine.connect()
したら下記エラーメッセージが出現。
InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') (Background on this error at: http://sqlalche.me/e/rvf5)
#調査
なんもいじってないのになーと思いながらターミナルからodbcinst -j
で見ているiniファイルとかを確認する。
$ odbcinst -j
unixODBC 2.3.6
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /Users/Macのユーザ名/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
odbc.iniファイルにDSNが定義されているはずなので、中身を見ようと、less /etc/odbc.ini
してもそんなファイルないよと怒られる。。。
絶対どっかにあるだろーと思いfind / -name odbc.ini
で探す。
$ find / -name odbc.ini
/usr/local/etc/odbc.ini
中身を確認
$ less /usr/local/etc/odbc.ini
[データソース名]
Driver=FreeTDS
Server=localhost
Port=1433
Database=データベース名
とても見覚えのあるデータソース名で定義があった。(juypter notebbokで使っているデータソース名)
これを上記のSYSTEM DATA SOURCESに放り込めばいいんじゃね?
#解決策
無邪気に/etcにコピー。/etcにはodbcinst.iniもなかったのでついでにそれもコピー
$ cp /usr/local/etc/odbc.ini /etc/odbc.ini
$ cp /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
再度juypter notebookから接続確認して見たら、InterfaceErrorも出現せず、無事接続できました。
原因は不明だけど、めでたしめでたし。