クイック スタート: Pythonを使用して接続し、Azure HorizonDB のデータに対してクエリを実行する (プレビュー)

このクイック スタートでは、Pythonを使用して Azure HorizonDB インスタンスに接続します。 macOS、Ubuntu Linux、Windows の各プラットフォームから SQL ステートメントを使用して、データベース内のデータを照会、挿入、更新、削除できます。

この記事の手順には、PostgreSQL 認証が含まれます。

PostgreSQL 認証では PostgreSQL に格納されているアカウントを使用するため、パスワードのローテーションを自分で管理する必要があります。

この記事では、Pythonを使用した開発には慣れているものの、HorizonDB Azure使用するのは初めてであることを前提としています。

Prerequisites

クライアント ワークステーションのファイアウォール規則を追加する

  • パブリック アクセス (許可された IP アドレス) を使用して Azure HorizonDB クラスターを作成した場合は、クラスターのファイアウォール規則の一覧にローカル IP アドレスを追加できます。 「Networking in Azure HorizonDB (Preview)を参照してください。

開発環境を準備する

コードを実行し、仮想環境を作成してアクティブ化するフォルダーに移動します。 仮想環境は、特定のバージョンの Python と、そのアプリケーションに必要なその他のパッケージ用の自己完結型ディレクトリです。

次のコマンドを実行し、仮想環境を作成してアクティブにします。

py -3 -m venv .venv
.venv\Scripts\activate

Python ライブラリをインストールする

コード例を実行するために必要な Python ライブラリをインストールします。

psycopg モジュールをインストールします。これによって、PostgreSQL データベースへの接続とクエリの実行が可能になります。

# Recommended: install the binary wheel that bundles a compatible libpq wrapper (Windows/macOS)
python -m pip install "psycopg[binary]"

# Linux alternative (if you prefer building against system libpq):
sudo apt-get update
sudo apt-get install -y libpq-dev build-essential python3-dev
python -m pip install psycopg

認証コードを追加する

このセクションでは、作業ディレクトリに認証コードを追加し、クラスター インスタンスでの認証と承認に必要な追加の手順を実行します。

認証コードを追加する前に、各例に必要なパッケージがインストールされていることを確認します。

必要なパッケージ (この記事の例):

  • パスワードの例: psycopg (推奨: python -m pip install "psycopg[binary]")

省略可能: これらのエントリを含む requirements.txt を作成し、 python -m pip install -r requirements.txt を使用してインストールして再現可能なインストールを行います。

  1. 次のコードをエディターにコピーし、get_conn.py という名前のファイルに保存します。

    import urllib.parse
    import os
    
    def get_connection_uri():
    
       # Read URI parameters from the environment
       dbhost = os.environ['DBHOST']
       dbname = os.environ['DBNAME']
       dbuser = urllib.parse.quote(os.environ['DBUSER'])
    password = os.environ['DBPASSWORD']
    sslmode = os.environ['SSLMODE']
    db_uri = f"host={dbhost} dbname={dbname} user={dbuser} password={password} sslmode={sslmode}"
       # Construct connection URI
       return db_uri
    
  2. データベース接続情報を取得します。

    Azure portal を使用して以下を実行します。

    1. Azure ポータルの左側のメニューで、[すべてのリソース を選択し、作成したクラスターを検索します。

    2. クラスター名を選択します。

    3. リソース メニューで、[概要] を選択します。 プライマリ エンドポイント (読み取り/書き込み) として表示されている値の上にマウス ポインターを置き、[クリップボードにコピー] ボタンを選択します。

      [概要] ページのプライマリ エンドポイントの値を示すスクリーンショット。

    4. 管理者ログインのパスワードを忘れた場合は、[パスワードのリセット] ボタンを使用してリセットできます。

      概要ページの [パスワードのリセット] ボタンを示すスクリーンショット。

  3. 接続 URI 要素用の環境変数を設定します。

    set DBHOST=<cluster-name>
    set DBNAME=<database-name>
    set DBUSER=<username>
    set DBPASSWORD=<password>
    set SSLMODE=require
    

Python の例を実行する方法

この記事の各コード例では、次のことを行います。

  1. テキスト エディターで新しいファイルを作成します。

  2. ファイルにコード例を追加します。

  3. ファイルに .py 拡張子を付けてプロジェクト フォルダーに保存します。たとえば、postgres-insert.py のように指定します。 Windows の場合は、ファイルを保存するときに UTF-8 エンコードを選択するようにしてください。

  4. プロジェクト フォルダーに、python に続けてファイル名を入力します (例: python postgres-insert.py)。

テーブルを作成してデータを挿入する

次のコード例では、psycopg.connect 関数を使用してAzure HorizonDB クラスターに接続し、SQL INSERT ステートメントを使用してデータを読み込みます。 cursor.execute 関数は、データベースに対して SQL クエリを実行します。

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Drop previous table of same name if one exists
cursor.execute("DROP TABLE IF EXISTS inventory;")
print("Finished dropping table (if existed)")

# Create a table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
print("Finished creating table")

# Insert some data into the table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("orange", 154))
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("apple", 100))
print("Inserted 3 rows of data")

# Clean up
conn.commit()
cursor.close()
conn.close()

コードが正常に実行されると、次の出力が生成されます。

Connection established
Finished dropping table (if existed)
Finished creating table
Inserted 3 rows of data

データの読み取り

次のコード例では、Azure HorizonDB クラスターに接続し、sql SELECT ステートメントで cursor.execute を使用してデータを読み取ります。 この関数はクエリを受け取り、cursor.fetchall() を使用して反復処理する結果セットを返します。

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Fetch all rows from table
cursor.execute("SELECT * FROM inventory;")
rows = cursor.fetchall()

# Print all rows
for row in rows:
    print("Data row = (%s, %s, %s)" %(str(row[0]), str(row[1]), str(row[2])))

# Cleanup
conn.commit()
cursor.close()
conn.close()

コードが正常に実行されると、次の出力が生成されます。

Connection established
Data row = (1, banana, 150)
Data row = (2, orange, 154)
Data row = (3, apple, 100)

データの更新

次のコード例では、Azure HorizonDB クラスターに接続し、sql UPDATE ステートメントで cursor.execute を使用してデータを更新します。

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Update a data row in the table
cursor.execute("UPDATE inventory SET quantity = %s WHERE name = %s;", (200, "banana"))
print("Updated 1 row of data")

# Cleanup
conn.commit()
cursor.close()
conn.close()

データの削除

次のコード例では、Azure HorizonDB クラスターに接続し、sql DELETE ステートメントで cursor.execute を使用して、前に挿入したインベントリ項目を削除します。

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Delete data row from table
cursor.execute("DELETE FROM inventory WHERE name = %s;", ("orange",))
print("Deleted 1 row of data")

# Cleanup
conn.commit()
cursor.close()
conn.close()