著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにTechEducationFundを選択しました。

序章

MariaDB は、データにアクセスして管理するためのSQLインターフェイスを備えた人気のあるMySQLリレーショナルデータベース管理システム(DBMS)のオープンソースバージョンです。 信頼性が高く、管理が容易です。これは、最新のアプリケーションに対応できるDBMSの本質的な品質です。 人工知能や機械学習などのテクノロジーでPythonの人気が高まっているため、MariaDBはPythonのデータベースサーバーに適したオプションです。

このチュートリアルでは、MySQLコネクタを使用してPythonアプリケーションをデータベースサーバーに接続します。 このモジュールを使用すると、アプリケーション内からデータベースサーバーでクエリを実行できます。 Ubuntu 18.04でPython環境用にMariaDBをセットアップし、MariaDBに接続してクエリを実行するPythonスクリプトを記述します。

前提条件

このガイドを開始する前に、次のものが必要です。

ステップ1—準備とインストール

このステップでは、MariaDBにデータベースとテーブルを作成します。

まず、ターミナルを開き、次のコマンドを使用してターミナルからMariaDBシェルに入ります。

  1. sudo mysql

MariaDBシェルに入ると、ターミナルプロンプトが変わります。 このチュートリアルでは、workplaceという名前のサンプル従業員データベースとemployeesという名前のテーブルに接続するPythonを記述します。

workplaceデータベースを作成することから始めます。

  1. CREATE DATABASE workplace;

次に、現在のデータベースとしてworkplaceを使用するようにMariaDBに指示します。

  1. USE workplace;

次の出力が表示されます。これは、これ以降に実行するすべてのクエリがworkplaceデータベースで有効になることを意味します。

Output
Database changed

次に、employeesテーブルを作成します。

  1. CREATE TABLE employees (first_name CHAR(35), last_name CHAR(35));

テーブルスキーマでは、パラメータfirst_nameおよびlast_nameは、最大長が35の文字列(CHAR)として指定されています。

これに続いて、MariaDBシェルを終了します。

  1. exit;

ターミナルに戻り、MariaDB認証資格情報を環境変数としてエクスポートします。

  1. export username="username"
  2. export password="password"

この手法により、スクリプト内にプレーンテキストでクレデンシャルを追加することを回避できます。

プロジェクトの環境を設定しました。 次に、スクリプトの作成を開始し、データベースに接続します。

ステップ2—データベースへの接続

このステップでは、 MySQL Connector をインストールし、データベースをセットアップします。

ターミナルで、次のコマンドを実行してコネクタをインストールします。

  1. pip3 install mysql-connector-python

pipは、Pythonの標準パッケージマネージャーです。 mysql-connector-pythonは、データベースコネクタのPythonモジュールです。

コネクタが正常にインストールされたら、新しいファイルPythonファイルを作成して開きます。

  1. nano database.py

開いたファイルで、importキーワードを使用して、osモジュールmysql.connectorモジュールをインポートします。

database.py
import os
import mysql.connector as database

ここでのasキーワードは、コードの残りの部分でmysql.connectordatabaseとして参照されることを意味します。

次に、Python変数としてエクスポートした認証クレデンシャルを初期化します。

database.py
. . .
username = os.environ.get("username")
password = os.environ.get("password")

databaseが提供するconnect()メソッドを使用して、データベース接続をフォローアップして確立します。 このメソッドは、クライアントの資格情報を指定する一連の名前付き引数を取ります。

database.py
. . .
connection = database.connect(
    user=username,
    password=password,
    host=localhost,
    database="workplace")

database.connect()メソッドの呼び出しを保持するconnectionという名前の変数を宣言します。 メソッド内で、userpasswordhost、およびdatabase引数に値を割り当てます。 ユーザーとパスワードについては、MariaDB認証資格情報を参照します。 同じシステムでデータベースを実行している場合、ホストはデフォルトでlocalhostになります。

最後に、接続でcursor()メソッドを呼び出して、データベースカーソルを取得します。

database.py
. . .
cursor = connection.cursor()

cursor は、データセットから一度に1行ずつデータを取得し、更新するデータベースオブジェクトです。

次のステップのためにファイルを開いたままにしておきます。

これで、資格情報を使用してMariaDBに接続できます。 次に、スクリプトを使用してデータベースにエントリを追加します。

ステップ3—データの追加

データベースカーソルでexecute()メソッドを使用して、このステップでデータベースにエントリを追加します。

関数add_data()を定義して、従業員の名前と名前を引数として受け入れます。 関数内に、try/exceptブロックを作成します。 カーソルオブジェクトの後に次のコードを追加します。

database.py
. . .
def add_data(first_name, last_name):
    try:
        statement = "INSERT INTO employees (first_name,last_name) VALUES (%s, %s)"
        data = (first_name, last_name)
        cursor.execute(statement, data)
        connection.commit()
        print("Successfully added entry to database")
    except database.Error as e:
        print(f"Error adding entry to database: {e}")

tryおよびexceptブロックを使用して、プログラム実行の通常のフローを妨害する例外(イベントまたはエラー)をキャッチして処理します。

tryブロックで、statementINSERTSQLステートメントを保持する変数として宣言します。 このステートメントは、MariaDBにfirst_name列とlast_name列に追加するように指示します。

コード構文は、SQLインジェクションの可能性を減らすパラメーターとしてデータを受け入れます。 パラメータを使用したプリペアドステートメントにより、指定されたパラメータのみが意図したとおりにデータベースに安全に渡されます。 通常、パラメータは注入できません。

次に、dataタプルとして宣言し、add_data関数から受け取った引数を使用します。 SQLステートメントとデータを渡して、cursorオブジェクトでexecute()メソッドを実行します。 execute()メソッドを呼び出した後、接続でcommit()メソッドを呼び出して、挿入されたデータを永続的に保存します。

最後に、これが成功した場合は、成功メッセージを出力します。

例外がある場合にのみ実行されるexceptブロックで、database.Erroreとして宣言します。 この変数は、例外のタイプまたはスクリプトが中断したときに発生したイベントに関する情報を保持します。 次に、eでフォーマットされたエラーメッセージを出力し、f-stringを使用してブロックを終了します。

データベースにデータを追加したら、次にデータを取得します。 次のステップでは、データを取得するプロセスについて説明します。

ステップ4—データの取得

このステップでは、Pythonコード内にSQLクエリを記述して、データベースからデータを取得します。

データベースカーソルで同じexecute()メソッドを使用して、データベースエントリを取得できます。

関数get_data()を定義して、従業員の名前を引数として受け入れます。この関数は、[X118X]