Pythonを使用しAzure SQLデータベースに接続しテーブルを作成してみます。
接続のために今回はpyodbcモジュールを用います。このライブラリ・モジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)
■仮想環境の構築
Pythonを使用しAzure SQLデータベースに接続してみますが、その前に仮想環境の構築を行い、インストールを行います。そのために、まずはWindows10のコマンドプロンプトを起動します。
C:\Users\user_>mkdir azure_db
起動後、上記のコマンドを入力し、Enterキーを押します。「mkdir」コマンドで「azure_db」ディレクトリを作成します。
C:\Users\user_>cd azure_db
作成後、上記のコマンドを入力し、Enterキーを押します。「cd」コマンドで「azure_db」ディレクトリ内に移動します。
C:\Users\user_\azure_db>py -3.8 -m venv .venv
移動後、上記のコマンドを入力し、Enterキーを押します。本来だと「python -m venv .venv」で仮想環境のディレクトリ「.venv」を作成しますが、今回はPythonのバージョンを指定しています。なお、今回仮想環境のディレクトリ名は「.venv」としていますが、ご自身で変更は可能です。
Enterキーを押すと、何も出力されませんが、これで仮想環境の作成が完了となります。
■仮想環境への切り替え
C:\Users\user_\azure_db>.venv\Scripts\activate.bat
完了後、上記のコマンドを入力し、Enterキーを押します。仮想環境のディレクトリ内に作成された activateスクリプトを実行し、仮想環境に入ります。
(.venv) C:\Users\user_\azure_db>
Enterキーを押すと、「(.venv)」と表示されます。これで仮想環境に入ることができました。
■pyodbcのインストール
(.venv) C:\Users\user_\azure_db>pip install pyodbc
仮想環境に入った後に、上記のコマンドを入力し、Enterキーを押します。これでpipを経由してpyodbcをインストールします。
Collecting pyodbc Using cached pyodbc-4.0.34-cp38-cp38-win_amd64.whl (75 kB) Installing collected packages: pyodbc Successfully installed pyodbc-4.0.34 WARNING: You are using pip version 20.1.1; however, version 22.2.2 is available. You should consider upgrading via the 'c:\users\user_\azure_db\.venv\scripts\python.exe -m pip install --upgrade pip' command.
Enterキーを押すと、インストールが開始され、「Successfully installed(正常にインストールされました)」と出力されます。これが出力されればインストールは完了となります。今回「WARNING(警告)」も出力されましたが、エラーではないので、一旦無視します。
■プログラムを作成する
インストール後、「azure_db」ディレクトリ内に「sql_db.py」というスクリプトファイルを作成します。作成後、コードエディタを開き、ファイル内にコードを記述します。
■コード
import pyodbc db_server = 'サーバー名' database = 'データベース名' username = 'データベースのユーザー名' password = 'データベースのパスワード' driver = '{ODBC Driver 18 for SQL Server}' with pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+db_server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+password) as conn: with conn.cursor() as cursor: cursor.execute(''' CREATE TABLE test1( id int primary key, name nvarchar(50), price int ) ''') consor.commit()
今回はimportでpyodbcモジュールを呼び出します。その後、db_server,database,username,password,driverという変数をそれぞれ定義します。定義した後にそれぞれの変数にAzureでSQLデータベースを作成した際に設定したサーバー名,データベースのユーザー名,データベースのパスワードを格納します。格納後、driver変数内に今回は「{ODBC Driver 18 for SQL Server}」と記述します。記述後、ODBC Driver for SQL Server のダウンロード(https://docs.microsoft.com/ja-JP/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16)にアクセスし、Windows用のMicrosoft ODBC Driver 18をダウンロードします。今回はPC環境にあわせて「 Microsoft ODBC Driver 18 for SQL Server (x86)」をダウンロードし、ダウンロードされた「msodbcsql.msi」のファイルをダブルクリックします。ダブルクリックすると、「ODBC Driver 18 for SQL Serverのセットアップ」ウィザードが表示されますので、ウィザードを進めてインストールを行います。この「Microsoft ODBC Driver for SQL Server」がないまま、スクリプトファイルを実行すると、「pyodbc.InterfaceError: (‘IM002’, ‘[IM002] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。 (0) (SQLDriverConnect)’)」というエラーが発生します。
インストール後、with構文とpyodbc.connect()を用います。pyodbc.connect()の括弧内には引数,パラメータとしてODBCドライバ,サーバ名,データベース名,ユーザID,パスワードを渡します。これでコネクション(通信路)取得します。取得後、with構文とconn.cursor()を用います。conn.cursor()でカーソルを作成します。カーソルは、クエリを実行し、データベースからレコードをフェッチするオブジェクトです。
カーソルを作成後、cursor.execute()を用います。括弧内には引数,パラメータとしてSQLクエリの実行を行うため、SQL文を渡します。今回は「CREATE TABLE」で「test1」というテーブルを作成し、テーブル内の列(カラム)は、id,name,priceの3つを作成します。これでSQLクエリが実行となります。
実行後、conn.commit()を用いて、変更内容を保存(コミット)します。保存(コミット)後、ファイルを保存します。
■実行・検証
保存後、コマンドプロンプト上で仮想環境に入った状態でスクリプトファイルを実行してみます。
(.venv) C:\Users\user_\azure_db>python sql_db.py
Traceback (most recent call last): File "sql_db.py", line 8, in with pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+db_server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+password) as conn: pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Reason: An instance-specific error occurred while establishing a connection to SQL Server. Connection was denied since Deny Public Network Access is set to Yes (https://docs.microsoft.com/azure/azure-sql/database/connectivity-settings#deny-public-network-access). To connect to this server, use the Private Endpoint from inside your virtual network (https://docs.microsoft.com/azure/sql-database/sql-database-private-endpoint-overview#how-to-set-up-private-link-for-azure-sql-database). (47073) (SQLDriverConnect); [42000] [Microsoft][ODBC Driver 18 for SQL Server]接続文字列の属性が無効です。 (0); [42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Reason: An instance-specific error occurred while establishing a connection to SQL Server. Connection was denied since Deny Public Network Access is set to Yes (https://docs.microsoft.com/azure/azure-sql/database/connectivity-settings#deny-public-network-access). To connect to this server, use the Private Endpoint from inside your virtual network (https://docs.microsoft.com/azure/sql-database/sql-database-private-endpoint-overview#how-to-set-up-private-link-for-azure-sql-database). (47073); [42000] [Microsoft][ODBC Driver 18 for SQL Server]接続文字列の属 性が無効です。 (0)')
実行してみると、上記のエラーメッセージが出力されました。出力された内容を確認すると「[パブリック ネットワーク アクセスの拒否] が [はい] に設定されているため、接続が拒否されました」ということでパブリック ネットワーク アクセスの変更を行います。
変更を行うために、「Microsoft Azure Portal」にログインし、ホームから「サービス」の「SQLデータベース」へ移動します。
移動後、作成したデータベースの名前をクリックします。今回は「test_0101」。
クリックすると、作成したデータベースの詳細が表示されますので、左メニューから「概要」をクリックし、さらに「サーバーファイヤーウォールの設定」をクリックします。
クリックすると、「ネットワーク」のページが表示され、「パブリック アクセス」タブを選択します。タブ内に「ファイアウォール規則」という項目があるので、こちらで「クライアント IPv4アドレス(***.***.**.***)の追加」をクリックします。クリックすると、クライアント IPv4アドレスが追加されます。これで追加したクライアント IPv4アドレスからリソースにアクセスすることが可能となりました。
この状態で再びスクリプトを実行します。
実行してみると、今度は先程のエラーメッセージは出力されず、データベース内にテーブルが作成されました。
作成後、「Microsoft Azure Portal」にログインし、ホームから「サービス」の「SQLデータベース」へ移動し、作成したデータベースの名前をクリック。クリックすると、データベースの詳細が表示され、左メニューから「クエリ エディター (プレビュー)」をクリックします。クリックすると、クエリ エディターが表示され、「テーブル」から作成したテーブルをクリックすると、ちゃんとテーブル内のカラム(列)も作成されていることが確認できました。
コメント