なんだかとても苦労したのでメモ。

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振らなきゃいけないのかしら。