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", ))
コメント