SQLAlchemyでAzureのSQL Databaseを使う
なんだかとても苦労したのでメモ。
AzureのコンソールでSQL Databaseを作る
たとえばこんな設定:
DB名: db-test
サーバ名: db-test-svr (db-test-svr.database.windows.net)
ユーザ名: testuser
パスワード: testpass
作ったデータベースのプロパティから見れる、ODBCでのデータベース接続文字列は次のようになっている:
(使うときは{your_password_here}
を置き換えるのを忘れないように…)
Driver={ODBC Driver 13 for SQL Server};Server=tcp:db-test-svr.database.windows.net,1433;Database=db-test;Uid=testuser@db-test-svr;Pwd={your_password_here};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;
Ubuntu (16.04 LTS) からSQL Databaseにアクセスする
ODBCドライバをインストールする
https://msdn.microsoft.com/en-us/library/hh568451(v=sql.110).aspx からのDownloadリンク先 https://blogs.msdn.microsoft.com/sqlnativeclient/2016/10/20/odbc-driver-13-0-for-linux-released/ に書いてある通り。
sudo su
sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/mssql-ubuntu-xenial-release/ xenial main" > /etc/apt/sources.list.d/mssqlpreview.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
apt-get update
apt-get install msodbcsql unixodbc-dev-utf16
apt-get install unixodbc-dev-utf16 #this step is optional but recommended*
isqlコマンドで接続確認
~/.odbc.iniにDSNを定義する。 (Driverは/etc/odbcinst.iniに定義されてるやつを指定)
[DBTest]
Description = database access test
Driver = ODBC Driver 13 for SQL Server
Server = db-test-svr.database.windows.net
Database = db-test
isqlコマンドで接続。 引数は~/.odbc.iniで定義したDSNと、Azureで作ったSQL Databaseのユーザ名・パスワード
isql DBTest testuser testpass
ここで繋がらないなら、ドライバの指定がおかしかったり、そもそもSQL Database建てられてなかったり。
Python/SQLAlchemyで接続する
必要なライブラリ:
pyodbc
sqlalchemy
最初に確認していたデータベース接続文字列を使ってengine
を作り、接続する。
mssql+pyodbc:///?odbc_connect=
の後にurlエンコードした接続文字列をつなげる。
ここが中途半端に間違っている情報ばかり検索に引っかかって苦労した。
import urllib
import sqlalchemy
dsn = 'Driver={ODBC Driver 13 for SQL Server};Server=tcp:db-test-svr.database.windows.net,1433;Database=db-test;Uid=testuser@db-test-svr;Pwd=testpass;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;'
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect=%s' % urllib.quote_plus(dsn))
conn = engine.connect()
あとは普段どおりに使えるんだと思われます…(python初心者
残った問題
SQL Databaseでファイヤーウォールを設定しないと行けないのだけれど、 アクセスを許可するにはグローバルIPアドレスで指定する以外なく、 アクセスしうるすべてのマシンに固定IP振らなきゃいけないのかしら。