0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure Database for MariaDB - 基本操作(Python)

Last updated at Posted at 2021-08-07

DBサーバ作成

公式ドキュメント参照

作成時に設定したパスワードはDBアクセス時に使用する

image-20210807160616611.png

以下、作成されたDBサーバ概要

image-20210807161013418.png

サーバ名サーバー管理者ログイン名はDBアクセス時に使用する
SSL接続を有効に設定している場合は、以下からSSL証明書を取得する

SSL 証明書を取得する
https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem

DBのファイアウォール設定

クライアントツールからのアクセス許可

**+ 現在のクラインとIPアドレスを追加する(xxx.xxx.xxx.xxx)**をクリックすることでIPアドレスが自動的に登録される

image-20210807164940799.png

Azure Functionsからのアクセス許可

Azure サービスへのアクセスを許可はいに設定する

image-20210807164956472.png

クライアントツールからのアクセス

公式ドキュメント

HeidiSQLの場合

image-20210807162922868.png

ホスト名/IP:DBサーバ概要のサーバ名
ユーザー: DBサーバ概要のサーバー管理者ログイン名
パスワード: 作成時に設定したパスワード

SSL接続を有効にしている場合は、SSL CA証明書にダウンロードしたSSL証明書のパスを設定

image-20210807162901623.png

今回は、以下のように適当なデータベース、テーブルを作成し、適当なデータを追加済

image-20210807165305756.png

データベース名: testdb
テーブル名: testtable

Azure Functions(Python)からのDBアクセス

クイック スタート:Python を使用して Azure Database for MySQL に接続してデータを照会する

今回はHTTPトリガー、関数名HttpTrigger1で作成

実装コード

__init__.py
import logging
import os
import azure.functions as func
import mysql.connector
from mysql.connector import errorcode

def main(req: func.HttpRequest) -> func.HttpResponse:

  logging.info('Python HTTP trigger function processed a request.')

  config = {
    'host': os.environ["MARIADB_HOST"],
    'user': os.environ["MARIADB_USER"],
    'password': os.environ["MARIADB_PASSWORD"],
    'database': 'testdb',
    'client_flags': [mysql.connector.ClientFlag.SSL],
    'ssl_ca': os.environ["MARIADB_SSL_CA"]
  }

  try:
    conn = mysql.connector.connect(**config)
    logging.info("Connection established")
  except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
      logging.info("Something is wrong with the user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
      logging.info("Database does not exist")
    else:
      logging.info(err)
  else:
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM testtable;")
    rows = cursor.fetchall()
    logging.info(f'Read: {cursor.rowcount}, row(s) of data.')

    # logging.info all rows
    for row in rows:
      logging.info(f'Data row = {row}')

  return func.HttpResponse(
      "This HTTP triggered function executed successfully.",
      status_code=200
  )

環境変数、その他設定

ファイル構成

xxx
 ├─ HttpTrigger1
 │    ├─ __init__.py
 │    ├─ function.json
 │    ├─ sample.dat
 │    └─ cert
 │         └─ BaltimoreCyberTrustRoot.crt.pem
 │
 ├─ local.settings.json
 └─ requirements.txt

SSL接続を有効にしている場合は、SSL証明書をHttpTrigger1以下の任意の場所に格納する

環境変数

local.settings.jsonにDBアクセスに必要な値を定義しておく
Pythonコード上からは os.environ["MARIADB_HOST"]のようにアクセスする

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "MARIADB_HOST": "<mydemoserver>.mysql.database.azure.com",
    "MARIADB_USER": "<myadmin>@<mydemoserver>",
    "MARIADB_PASSWORD": "<mypassword>",
    "MARIADB_SSL_CA": "HttpTrigger1/cert/BaltimoreCyberTrustRoot.crt.pem"
  }
}

local.settings.jsonはローカル環境実行用の環境変数のため、
Azure Functionsの構成から以下のようにアプリケーション設定を追加する
追加するアプリケーション設定の値はlocal.settings.jsonと同様

image-20210807172426741.png

パッケージ

requirements.txtに以下のようにmysql-connector-pythonを追加する

requirements.txt
# DO NOT include azure-functions-worker in this file
# The Python Worker is managed by Azure Functions platform
# Manually managing azure-functions-worker may cause unexpected issues

azure-functions
mysql-connector-python

実行結果

image-20210807173023507.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?