PythonでMariaDBを操作するサンプル

MariaDBでDBを操作するサンプルを置いておきます。MariaDBと互換があるMySQLの方がシェアが高いのですが、流れはMariaDBにあります。よって、MariaDBの方にしました。

MariaDBはMySQLから派生し、MySQLと完全互換であったものの、JSONの扱いで違いが生じました。JSONは、テーブルの仕様変更に応えられる技術ですので、その違いは無視できなくなりました。今後は、どちらかを選ぶ必要があります。

MariaDBのシェアは、MySQLと比較すると1/10と高くはありません。しかし、性能や頑健性の優位性から大手企業で採用が進んでいます。身近なところでは、Google、Facebookです。また、UbuntueやDebian等の主要なLinuxのディストリビューションに入っているのは、MySQLではなくMariaDBとなっています。そして、国内でもっとも高いシェアを誇るレンタルサーバのXServerもMariaDBに変更しており、もはや流れは既にMariaDBに傾いています。このような理由から、MariaDBにしました。

MariaDBのインストールと起動

MariaDBを動かすには、MariaDBの他、ブラウザでMariaDBを操作できるpypmysqlを含むxamppを入れるのが、手間が少なくて簡単です。これらを開発用のOSにいれます。同様のものでMAMPがありますが、入るDBはMySQLになってしまいます。ちがみに、xamppは完全無償です。

XAMPPの公式サイトからOSにあったものをダウンロードし、インストールします。インストール時、Apache、MySQL、PHP、phpMyAdminにチェックを入れる必要があります。チェック項目はMySQLとなっていますが、入るはMariaDBです。

インストールが完了したら、XAMPP-Cotrolを起動して、ApacheとMySQLの”start”ボタン押下で、MariaDBが使えるようになります。

MariaDBをGUIで操作できるphpMyAdminは、XAMPP-CotrolのMySQLの”admin”ボタンを押下する表示できます。

テーブル作成

pythonで制御するDBを”py_test”という名前で作成しておきます。MariaDBのターミナルで作成できますが、phpMyAdminの左側にある「新規作成」でも作成できます。

table”accounts”を作成します。phpMyAdminで作成したDB”py_test”を選択し、SQLタブを選択すると下のクエリを実行できます。

CREATE TABLE py_test.contacts (
   id INT PRIMARY KEY AUTO_INCREMENT,
   first_name VARCHAR(25),
   last_name VARCHAR(25),
   email VARCHAR(100)
) ENGINE=InnoDB;

CREATE TABLE py_test.accounts (
   id INT PRIMARY KEY AUTO_INCREMENT,
   first_name VARCHAR(25),
   last_name VARCHAR(25),
   email VARCHAR(100),
   amount DECIMAL(15,2),
) ENGINE=InnoDB;

python用のパッケージのインストール

pip install mairadb

PythonでMariaDBを制御するサンプル

下のサンプルでは、テーブルに行を追加し、追加した行の値を更新しています。トランザクションで実行しており、途中で失敗したら、テーブル操作をなかったことにしています。

import mariadb

def test_mariadb_transactions() -> None:

    try:
        conn = mariadb.connect(	#	(1)
            user="root",
            password="pw",
            host="localhost",
            port=3306)

        cur = conn.cursor()		#	(2)

        #   アカウントの追加
        cur.execute(
            "INSERT INTO py_test.accounts(first_name, last_name, email, amount) VALUES (?, ?, ?, ?)",
            ("John", "Rockefeller", "john.rockefeller@example.com", 418000000000.00))

        #   指定メールアドレスの金額を減算
        cur.execute(
            "UPDATE py_test.accounts SET amount=(amount-?) WHERE email=?",
            (1000000.00, "john.rockefeller@example.com"))

        #   コミット(トランザクションの確定)
        conn.commit()	#	(3)

        #   明示的に呼ばなくてもスコープが外れると呼ばれる
        conn.close()	#	(4)
    except Exception as e:
        print(f"Error commiting transaction: {e}")

        #   失敗したときのために、ロールバック
        conn.rollback()	#	(5)

localhostのMariaDbに、DBに登録済みのuser名とパスワードで接続(1)します。カーソルという制御を蓄えておくものを作成(2)し、カーソルに制御命令を蓄え、全ての準備が終わったら蓄えたものをコミット(3)します。

(3)のコミット以前に例外が発生しても、(5)のロールバックにより、加えた操作はなかったことにできます。しかし、まとめてコミットするのではなく、自動でする方法もあります。デフォルトでは自動コミットはFalseに設定されています。

conn.autocommit = True

ちなみに、ここではmariadbをインポートして制御していますが、ほとんどMySQLのパッケージ”mysql”と同じです。それだけではなく、上のような単純な行の追加や更新は、MariaDBのパッケージでなくてもmysqlのもので制御できます。

MariaDBサンプル 行の表示

全行の表示サンプルです。

conn.autocommit = True
cur.execute("SELECT first_name, last_name, email, amount FROM py_test.accounts")
for (first_name, last_name, email, amount) in cur:
    print(f"{first_name} {last_name} <{email}> {amount}")

MariaDBサンプル 行の削除

指定行の削除のサンプルです。

conn.autocommit = True
cur.execute("DELETE FROM py_test.accounts WHERE email = ?", ("john.rockefeller@example.com", ))

コメント

タイトルとURLをコピーしました