Databricksでのオフライン環境下におけるMicrosoft ODBC Driver for SQL Serverのインストールガイド


## 概要

Databricks 環境で Microsoft ODBC Driver for SQL Server をオフラインでインストールする手順を説明します。具体的には、以下のステップをカバーします。

1. Databricks 上にて`apt-get`を`--download-only`オプションを指定して実行することでパッケージをダウンロードし、Repo にてファイルを保存
1. ダウンロード済みのパッケージをインストール


`apt-get` コマンドの `--download-only` オプションを使用すると、必要なパッケージが `/var/cache/apt/archives` ディレクトリにダウンロードされます。不足しているパッケージは環境に依存するため、Databricks 上での実行が推奨されます。

```text
       -d, --download-only
           Download only; package files are only retrieved, not unpacked or installed.
           Configuration Item: APT::Get::Download-Only.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c4dfba21-f3fb-0582-3d9c-67a022cfc931.png)


引用元：[Ubuntu Manpage: apt-get - APT package handling utility -- command-line interface](https://manpages.ubuntu.com/manpages/bionic/man8/apt-get.8.html)


## 実行手順

### 1. Databricks 上にて`apt-get`を`--download-only`オプションを指定して実行することでパッケージをダウンロードし、Repo にてファイルを保存

Databricks で以下のコマンドを実行し、Microsoft ODBC Driver for SQL Server のインストールに必要なパッケージをダウンロードします。

```python
%sh
# /var/cache/apt/archives を初期化
apt-get clean

# msodbcsql18 インストールに不足しているパッケージをダウンロード
curl -s https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
curl -s https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list > /dev/null
sudo apt-get update -qq
sudo apt-get -d install msodbcsql18 -y

# msodbcsql18 インストールに必要なパッケージを指定したディレクトリに保存
TGT_DIR="lib/msodbcsql18"
mkdir -p "./"$TGT_DIR
cp /var/cache/apt/archives/*.deb "./"$TGT_DIR
echo -e "\n-- ダウンロード先のディレクトリ"
dir=$(pwd)
echo $dir"/"$TGT_DIR
echo -e "\n-- ダウンロードされたパッケージの一覧"
ls "$TGT_DIR"
echo -e "\n-- ディレクトリ構成"
pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'
```

```text
-- ダウンロード先のディレクトリ
/Workspace/Repos/qiita/mssql_odbc_init/lib/msodbcsql18

-- ダウンロードされたパッケージの一覧
msodbcsql18_18.3.3.1-1_amd64.deb
odbcinst_2.3.9-5ubuntu0.1_amd64.deb

-- ディレクトリ構成
/Workspace/Repos/qiita/mssql_odbc_init
|--lib
|  |--msodbcsql18
|  |  |--msodbcsql18_18.3.3.1-1_amd64.deb
|  |  |--odbcinst_2.3.9-5ubuntu0.1_amd64.deb
|--pyodbc_test
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/15c58292-eff5-ce12-63ce-0ffa60bccc1b.png)

### 2. ダウンロード済みのパッケージをインストール

ダウンロードしたパッケージをインストールします。`TGT_DIR`の値とパッケージ名を必要に応じて変更します。

```python
%sh
TGT_DIR="/Workspace/Repos/qiita/mssql_odbc_init/lib/msodbcsql18"

sudo dpkg -i $TGT_DIR"/""odbcinst_2.3.9-5ubuntu0.1_amd64.deb"
sudo ACCEPT_EULA=Y dpkg -i $TGT_DIR"/""msodbcsql18_18.3.3.1-1_amd64.deb"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/785b4605-e6eb-c2f9-28f1-50be7ab4de14.png)

### 3. 動作確認

Azure SQL Database への接続をテストして、インストールが正常に行われたことを確認します。接続情報を必要に応じて変更します。

```python
import pyodbc

server = "ads-01"  ## サーバー名
database = "ads-01"  ## データベース名
username = "user"  ## Azure SQL DB のユーザー名
password = "password"  ## Azure SQL DB のパスワード

sql_connect_string = f"Driver={{ODBC Driver 18 for SQL Server}};SERVER=tcp:"
sql_connect_string += f"{server}.database.windows.net,1433;"
sql_connect_string += f"Database={database};Uid={username};Pwd={password};"
sql_connect_string += f"Encrypt=yes;TrustServerCertificate=no;ConnectionTimeout=30;"

sql = """
SELECT 'abc' as str_col
UNION ALL
SELECT N'あいう' as str_col
UNION ALL
SELECT NULL as str_col
;
"""

try:
    with pyodbc.connect(sql_connect_string, timeout=300) as conn:
        with conn.cursor() as cursor:
            # SQLクエリを実行します。
            cursor.execute(sql)

            # # 結果を取得して表示します。
            for row in cursor:
                print(row)

except pyodbc.Error as e:
    print("An error occurred while connecting to the database.")
    print(e)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b95b291f-f60c-b154-b944-13627783df7c.png)