Ubuntu18.04でPythonを使用してMariaDBにデータを保存および取得する方法

提供:Dev Guides
移動先:案内検索

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

序章

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

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

前提条件

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

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

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

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

sudo mysql

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

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

CREATE DATABASE workplace;

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

USE workplace;

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

OutputDatabase changed

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

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

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

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

exit;

ターミナルに戻り、MariaDB認証クレデンシャルを環境変数としてエクスポートします。

export username="username"
export password="password"

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

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

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

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

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

pip3 install mysql-connector-python

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

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

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] SQLクエリを使用してexecute()メソッドで呼び出し、正確な行を見つけます。

database.py

. . .
def get_data(last_name):
    try:
      statement = "SELECT first_name, last_name FROM employees WHERE last_name=%s"
      data = (last_name,)
      cursor.execute(statement, data)
      for (first_name, last_name) in cursor:
        print(f"Successfully retrieved {first_name}, {last_name}")
    except database.Error as e:
      print(f"Error retrieving entry from database: {e}")

tryブロックで、statementSELECTSQLステートメントを保持する変数として宣言します。 このステートメントは、特定の名前が一致したときにemployeesテーブルから列first_nameおよびlast_nameを取得するようにMariaDBに指示します。

ここでも、パラメーターを使用してSQLインジェクションの可能性を減らします。

最後の関数と同様に、datalast_nameの後にコンマを付けたタプルとして宣言します。 SQLステートメントとデータを渡して、cursorオブジェクトでexecute()メソッドの実行に進みます。 for loop を使用して、カーソルに返された要素を繰り返し処理し、一致するものがあれば出力します。

例外がある場合にのみ実行されるexceptブロックで、database.Erroreとして宣言します。 この変数は、発生する例外のタイプに関する情報を保持します。 次に、eでフォーマットされたエラーメッセージを印刷して、ブロックを終了します。

最後のステップでは、定義された関数を呼び出してスクリプトを実行します。

ステップ5—スクリプトを実行する

このステップでは、スクリプトを実行可能にしてターミナルから実行するための最後のコードを記述します。

add_data()およびget_data()をサンプルデータ(文字列)で呼び出してスクリプトを完成させ、コードが期待どおりに機能していることを確認します。

複数のエントリを追加する場合は、選択したサンプル名を使用してadd_data()を呼び出すことができます。

データベースの操作が終了したら、リソースの浪費を避けるために接続を必ず閉じてください。connection.close()

database.py

import os
import mysql.connector as database

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

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

cursor = connection.cursor()

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)
    cursor.commit()
    print("Successfully added entry to database")
    except database.Error as e:
    print(f"Error adding entry to database: {e}")

def get_data(last_name):
    try:
      statement = "SELECT first_name, last_name FROM employees WHERE last_name=%s"
      data = (last_name,)
      cursor.execute(statement, data)
      for (first_name, last_name) in cursor:
        print(f"Successfully retrieved {first_name}, {last_name}")
    except database.Error as e:
      print(f"Error retrieving entry from database: {e}")

add_data("Kofi", "Doe")
get_data("Doe")

connection.close()

エラーを回避するために、コードが正しくインデントされていることを確認してください。

同じディレクトリにdatabase.pyファイルを作成し、次のコマンドを使用してスクリプトを実行します。

python3 ./database.py

次の出力が表示されます。

OutputSuccessfully added entry to database
Successfully retrieved Kofi, Doe

最後に、MariaDBに戻って、エントリが正常に追加されたことを確認します。

ターミナルからMariaDBプロンプトを開きます。

sudo mysql

次に、MariaDBにworkplaceデータベースに切り替えて使用するように指示します。

USE workplace;

成功メッセージDatabase changedを受け取ったら、employeesテーブルのすべてのエントリのクエリに進みます。

SELECT * FROM employees;

出力は次のようになります。

Output+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Kofi       | Doe       |
+------------+-----------+
1 row in set (0.00 sec)

すべてをまとめると、MariaDBデータベースから情報を保存および取得するスクリプトを作成しました。

必要なライブラリをインポートすることから始めました。 mysql-connectorを使用してデータベースに接続し、osを使用して環境から認証資格情報を取得しました。 データベース接続で、カーソルを取得してクエリを実行し、コードをadd_dataおよびget_data関数に構造化しました。 関数を使用して、データベースにデータを挿入し、データベースからデータを取得しました。

削除を実装する場合は、必要な宣言、ステートメント、および呼び出しを使用して同様の関数を作成できます。

結論

Ubuntu 18.04でPythonスクリプトを使用して、MariaDBへのデータベース接続を正常にセットアップしました。 ここから、データベースにデータを保存する必要があるPythonプロジェクトのいずれかで同様のコードを使用できます。 このガイドは、MySQLから開発された他のリレーショナルデータベースにも役立つ場合があります。

Pythonを使用してプロジェクトを実行する方法の詳細については、Pythonに関する他のコミュニティチュートリアルを確認してください。