本記事では、mysqlclient と OB Cloud データベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、クエリなどの基本的な操作を実装する方法を紹介します。
前提条件
- Python 3.xとpipがインストール済みであること。
- OB Cloudデータベースアカウントに登録済みで、クラスタインスタンスとOB Cloud MySQLモードのテナントを作成していること。詳細については、クラスタインスタンスの作成およびテナントの作成をご参照ください。
- 対象のMySQL互換モードテナントの接続文字列を取得済みであること。詳細な操作については、接続文字列の取得をご参照ください。
操作手順
- Pythonとpipのバージョンを確認します。
- mysqlclientライブラリをインストールします。
config.pyファイル内のデータベース接続情報を修正します。main.pyファイルを実行します。- 対話型コマンドラインインターフェースで対応する操作を実行します。
ステップ1:Pythonとpipのバージョンを確認する
コマンドプロンプトまたはPowerShellターミナルを開き、python --version と pip --version コマンドを実行して、Pythonとpipが正常にインストールされていることを確認します。
例:
PS C:\Windows\system32> python --version
Python 3.11.2
PS C:\Windows\system32> pip --version
pip 23.3.1 from C:\Users\xxx\AppData\Local\Programs\Python\Python311\Lib\site-packages\pip (python 3.11)
ステップ2:mysqlclientライブラリをインストールする
mysqlclientライブラリをインストールする際には、OceanBaseデータベースに接続するためにMySQL C APIをコンパイルおよびリンクする必要があります。そのため、コンパイル時に使用するために、MySQL Connector CまたはMySQL C APIの開発ファイルをインストールする必要があります。
方法1:プリコンパイル済みバイナリファイルを使用してmysqlclientライブラリをインストールする
Windowsでは、プリコンパイル済みバイナリファイルを使用してmysqlclientライブラリをインストールできます。Download filesから、ご使用のPythonバージョンとOSプラットフォームに対応する whl ファイルをダウンロードし、pip install コマンドを使用してインストールします。
例:
コマンドプロンプトまたはPowerShellターミナルを開き、以下のコマンドを実行して、必要なPythonライブラリをインストールします。
whlファイルが保存されているディレクトリに移動します。cd D:\download以下のコマンドを実行して、mysqlclientライブラリをインストールします。
PS D:\download> pip install mysqlclient-2.2.0-cp311-cp311-win_amd64.whl Processing d:\download\mysqlclient-2.2.0-cp311-cp311-win_amd64.whl Installing collected packages: mysqlclient Successfully installed mysqlclient-2.2.0
方法2:mysqlclientライブラリを直接インストールする
MySQLをインストールします。
mysqlclientを使用する前に、MySQLデータベースサーバーをインストールする必要があります。mysqlclientライブラリは、MySQLとの通信を行うために、MySQLのクライアントプログラムとライブラリファイルに依存します。MySQL公式Webサイトからインストーラーをダウンロードし、指示に従ってインストールします。
Cコンパイラをインストールします。
WindowsにCコンパイラをインストールするには、Visual StudioまたはMinGWをインストールすることができます。
開発ツールをインストールします。
Windowsでは、MySQL Connector/Cを使用してMySQLの開発ライブラリを取得できます。以下の手順に従ってMySQL Connector/Cをインストールできます:
MySQL公式Webサイトのダウンロードページを開きます。
ダウンロードページで、適切なOSタイプとバージョンを選択し、対応するインストールパッケージをダウンロードします。
ダウンロードしたインストールパッケージを実行し、インストールガイドの指示に従ってインストールします。
インストールプロセスで、Custom インストールタイプを選択し、Development Components がインストールされていることを確認します。
インストール完了後、コンピューターを再起動します。
mysqlclientライブラリをインストールします。
コマンドプロンプトまたはPowerShellターミナルを開き、以下のコマンドを実行して必要なPythonライブラリをインストールします。
以下のコマンドを実行して、コードの
python-mysqlclientディレクトリに移動します。cd python-mysqlclient以下のコマンドを実行して、mysqlclientライブラリをインストールします。
pip install -r requirements.txt
説明
pip install mysqlclientコマンドを直接実行してmysqlclientライブラリをインストールすることもできます。
Linux環境では、PythonのC拡張機能はPython.hヘッダーファイルに依存しており、このヘッダーファイルは通常python3-develパッケージに含まれています。python3-develパッケージがインストールされていない場合、MySQL C APIをコンパイルする際にPython.hが見つからないエラーが発生します。
コマンドプロンプトまたはPowerShellターミナルを開き、以下のコマンドを実行して必要なPythonライブラリをインストールします。
python3-develがインストールされているか確認します。以下のコマンドを実行して、
python3-develパッケージがインストールされているかどうかを確認します:rpm -q python3-develインストール済みの場合、以下のような情報が出力されます:
python3-devel-3.x.x-x.el7.x86_64ここで、3.x.xはPython3のバージョン番号、x86_64はシステムのCPUアーキテクチャを表します。
インストールされていない場合、以下のような情報が出力されます:
package python3-devel is not installedその場合、以下のコマンドで
python3-develパッケージをインストールできます:sudo yum install python3-develインストール完了後、再度
rpm -q python3-develコマンドを実行してインストールが成功したか確認します。
mysqlclientライブラリをインストールします。
以下のコマンドを実行して、コードの
python-mysqlclientディレクトリに移動します。cd python-mysqlclient以下のコマンドを実行して、プロジェクトに必要なPythonライブラリをインストールします。
sudo pip install -r requirements.txt
説明
sudo pip install mysqlclientコマンドを直接実行してmysqlclientライブラリをインストールすることもできます。
ステップ3:config.pyファイル内のデータベース接続情報を修正する
前提条件で取得した接続文字列情報に基づいて、python-mysqlclient/config.py ファイル内のデータベース接続情報を修正します。
python-mysqlclientプロジェクトフォルダに移動します。config.pyファイル内のデータベース接続情報を修正します。- Windows環境では、テキストエディタを使用して
config.pyファイルを開き、ファイル内のデータベース接続情報を実際の状況に合わせて修正します。 - Linux環境では、
vi config.pyまたはvim config.pyコマンドを使用してconfig.pyファイルを編集し、ファイル内のデータベース接続情報を実際の状況に合わせて修正します。
config.pyファイル内のデータベース接続情報例は以下のとおりです:OCEANBASE_CONFIG = { 'host': 't5******.********.oceanbase.cloud', 'port': 3306, 'user': 'test', 'password': '******', 'database': 'test', 'charset': 'utf8mb4' }- Windows環境では、テキストエディタを使用して
ステップ4:main.pyファイルを実行する
コマンドプロンプトまたはPowerShellターミナルを開き、python main.py コマンドを実行してプログラムを起動します。
python-mysqlclientプロジェクトディレクトリに移動します。例:
cd /home/admin/python-mysqlclient以下のコマンドを実行して
main.pyプログラムを起動します。python main.py実行結果は次のとおりです:
Table created successfully Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
ステップ5:対話型コマンドラインインターフェースで対応する操作を実行する
データ挿入成功の例。
対話型コマンドラインインターフェースで、コマンド
1を入力し、Enterキーを押します。例:
Enter the command [1/2/3]> 1Enter name:のプロンプトが表示されたら、名前を入力し、Enterキーを押します。例:
Enter name:A1Enter age:のプロンプトが表示されたら、年齢を入力し、Enterキーを押します。例:
Enter age:18データ挿入が成功し、
Record inserted successfullyと表示されます。最後に、コマンドの説明が表示され、ユーザーは1、2、または3を入力してEnterキーを押すことで対応する操作を実行できるよう促されます。例:
Record inserted successfully Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
データ挿入失敗の例。
対話型コマンドラインインターフェースで、コマンド
1を入力し、Enterキーを押します。例:
Enter the command [1/2/3]> 1Enter name:のプロンプトが表示されたら、名前を入力し、Enterキーを押します。例:
Enter name:A2Enter age:のプロンプトが表示されたら、年齢を入力し、Enterキーを押します。注意
年齢フィールドのデータ型は整数型です。
例:
Enter age:十八データ挿入エラーメッセージ
(1366, 'Incorrect integer value')が返されます。最後に、コマンドの説明が表示され、ユーザーは1、2、または3を入力してEnterキーを押すことで対応する操作を実行できるよう促されます。例:
(1366, 'Incorrect integer value') Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
データのクエリ例。
対話型コマンドラインインターフェースで、コマンド
2を入力し、Enterキーを押します。例:
Enter the command [1/2/3]> 2テーブルのデータが表示されます。最後に、コマンドの説明が表示され、ユーザーは
1、2、または3を入力してEnterキーを押すことで対応する操作を実行できるよう促されます。例:
(1, 'A1', 18) Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
誤ったコマンドの入力例。
対話型コマンドラインインターフェースで、
1、2、または3以外のコマンドを入力し、Enterキーを押します。例:
Enter the command [1/2/3]> Aエラーメッセージ
Invalid command, please enter command again [1/2/3]が返されます。最後に、コマンドの説明が表示され、ユーザーは1、2、または3を入力してEnterキーを押すことで対応する操作を実行できるよう促されます。例:
Invalid command, please enter command again [1/2/3] Instruction: 1.Insert Data; 2.Query Data; 3.Exit. Enter the command [1/2/3]>
プログラムの終了例。
対話型コマンドラインインターフェースで、コマンド
3を入力し、Enterキーを押してプログラムを終了します。例:
Enter the command [1/2/3]> 3
プロジェクトコードについて
python-mysqlclient をクリックしてプロジェクトコードをダウンロードします。これは python-mysqlclient.zip という名前の圧縮ファイルです。
解凍すると、python-mysqlclient という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
python-mysqlclient
├── config.py
├── db.py
├── main.py
└── requirements.txt
ファイルの説明:
config.py:データベース接続設定情報を管理するために使用されます。db.py:テーブルの作成、データの挿入、データのクエリなど、データベース操作に使用されます。main.py:アプリケーションのエントリポイントであり、シンプルなユーザーインターフェースが含まれています。ユーザーはコマンドを入力することで対応する操作を実行できます。requirements.txt:プロジェクトに必要なPythonライブラリのリストです。説明
本記事で提供されているコードには、mysqlclientライブラリのバージョン要件のみが記載されています。
pip install -r requirements.txtコマンドを実行することで、必要なライブラリが自動的にインストールされます。
config.pyのコード紹介
Pythonでデータベースに接続する際には、データベース接続パラメータを指定する必要があります。これらのパラメータは、config.py ファイルなどの別の設定ファイルに配置できます。これらのパラメータを辞書に格納することで、各ファイルに繰り返し記述する手間を省くことができ、他のPythonファイルでこの辞書を参照するだけでデータベースに接続できます。
本記事で提供されている config.py ファイル内のコードは、OceanBaseデータベース接続パラメータを管理するために使用される OCEANBASE_CONFIG という名前の辞書変数を定義しています。
コード:
OCEANBASE_CONFIG = {
'host': 'localhost',
'port': port,
'user': 'user_name',
'password': '',
'database': 'db_name',
'charset': 'utf8mb4'
}
パラメータの説明:
host:接続文字列の-hパラメータから取得したOB Cloudデータベースの接続アドレスです。port:接続文字列の-Pパラメータから取得したOB Cloudデータベースの接続ポートです。user:接続文字列の-uパラメータから取得したアカウント名です。password:接続文字列の-pパラメータから取得したアカウントのパスワードです。database:接続文字列の-Dパラメータから取得した、アクセスするデータベースの名前です。charset:データベース接続時に使用する文字セットです。
注意
具体的なプロパティ(パラメータ)の設定は、プロジェクトの要件とデータベースの特性によって異なります。実際の状況に応じて調整と設定を行うことを推奨します。
db.pyのコード紹介
db.py ファイルは、データベース操作をカプセル化したPython言語で記述されたモジュールであり、主にデータベースの追加、削除、変更、検索操作を実装するために使用されます。
このファイルには、主に以下の部分が含まれています:
MySQLdbモジュールとデータベース接続パラメータをインポートします。
コード:
import MySQLdb from config import OCEANBASE_CONFIGテーブル作成の関数を定義します。
関数
create_tableを定義します。この関数は、OceanBaseデータベースにtest_tbl1という名前のテーブルを作成する役割を果たします。withステートメントを使用してデータベース接続とカーソルオブジェクトのライフサイクルを管理することで、データベース接続とカーソルオブジェクトの安全なクローズを保証し、メモリリークなどの問題を回避します。SQLステートメントを定義し、SQLステートメントを実行し、実行結果または例外情報を出力します。コード:
def create_table(): with MySQLdb.connect(**OCEANBASE_CONFIG) as conn: with conn.cursor() as cursor: try: create_table_sql = """ CREATE TABLE test_tbl1 ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT UNSIGNED NOT NULL, PRIMARY KEY (id) ) ENGINE=OCEANBASE AUTO_INCREMENT=1 """ cursor.execute(create_table_sql) print("Table created successfully") except MySQLdb.Error as err: print(err)データ挿入の関数を定義します。
関数
insert_recordを定義します。この関数は、指定されたテーブルにレコードを挿入する機能を主に実装しています。レコードにはnameとageの2つのフィールドが含まれます。withステートメントを使用してデータベース接続とカーソルオブジェクトのライフサイクルを管理することで、データベース接続とカーソルオブジェクトの安全なクローズを保証し、メモリリークなどの問題を回避します。SQLステートメントを定義し、挿入操作を実行し、トランザクションをコミットし、実行結果または例外情報を出力します。コード:
def insert_record(table_name, name, age): with MySQLdb.connect(**OCEANBASE_CONFIG) as conn: with conn.cursor() as cursor: try: insert_sql = f"INSERT INTO {table_name} (name, age) VALUES (%s, %s)" cursor.execute(insert_sql, (name, age)) conn.commit() print("Record inserted successfully") except MySQLdb.Error as err: print(err)テーブルデータのクエリ関数を定義します。
関数
select_allを定義します。この関数は、指定されたテーブル内のすべてのレコードをクエリする機能を主に実装しています。withステートメントを使用してデータベース接続とカーソルオブジェクトのライフサイクルを管理することで、データベース接続とカーソルオブジェクトの安全なクローズを保証し、メモリリークなどの問題を回避します。SQLステートメントを定義し、クエリ操作を実行してクエリ結果をイテレーションし、すべてのレコードを出力します。例外が発生した場合は、例外をキャッチして例外情報を出力します。コード:
def select_all(table_name): with MySQLdb.connect(**OCEANBASE_CONFIG) as conn: with conn.cursor() as cursor: try: select_sql = f"SELECT * FROM {table_name}" cursor.execute(select_sql) result = cursor.fetchall() for row in result: print(row) except MySQLdb.Error as err: print(err)
main.py コードの紹介
本記事の main.py の主な役割は、PythonとMySQLdbモジュールを使用してデータベースを操作する方法を示し、対話型のコマンドラインインターフェースを通じて操作を実行できるようにすることです。このプログラムを使用して、テーブルの作成、レコードの挿入、すべてのレコードのクエリを行い、基本的なデータベース操作を実現できます。
このファイルには、主に以下の部分が含まれています:
db.pyファイルで定義された関数をインポートします。dbモジュールから
create_table、insert_record、select_allの3つの関数をインポートします。コード:
from db import create_table, insert_record, select_allデータベースを操作するための関数を定義します。
関数
mainを定義します。この関数は、データベースを操作するためのシンプルな対話型コマンドラインプログラムを実装しています。まずcreate_table関数を呼び出してtest_tbl1という名前のテーブルを作成し、次にユーザーのコマンド入力を待つwhileループに入ります。ユーザーの選択に応じて、プログラムは挿入またはクエリ操作を行うために異なる関数を呼び出し、ユーザーが3を入力してプログラムを終了するまで続行します。ユーザーが無効なコマンドを入力した場合、プログラムは再入力を促します。入力されたコマンドに応じて、プログラムはデータの挿入(1)、データのクエリ(2)、プログラムの終了(3)など、異なる操作を実行します。
コード:
def main(): create_table() while True: print("Instruction: 1.Insert Data; 2.Query Data; 3.Exit.") command = input("Enter the command [1/2/3]> ") if command == "1": name = input("Enter name:") age = input("Enter age:") insert_record("test_tbl1", name, age) elif command == "2": select_all("test_tbl1") elif command == "3": break else: print("Invalid command, please enter command again [1/2/3]")main関数の使用シナリオを設定します。main.pyが直接実行された場合にのみmain関数が呼び出され、プログラムの主要なロジックが実行されるように設定します。このプログラムが他のモジュールにインポートされた場合は、main関数は実行されません。コード:
if __name__ == "__main__": main()説明
この記述方法により、モジュールをインポートした際に
main関数が自動的に実行されるのを防ぎ、プログラムの再利用性と拡張性を確保できます。
全コード表示
OCEANBASE_CONFIG = {
'host': 'localhost',
'port': port,
'user': 'user_name',
'password': '',
'database': 'db_name',
'charset': 'utf8mb4'
}
import MySQLdb
from config import OCEANBASE_CONFIG
def create_table():
with MySQLdb.connect(**OCEANBASE_CONFIG) as conn:
with conn.cursor() as cursor:
try:
create_table_sql = """
CREATE TABLE test_tbl1 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
) ENGINE=OCEANBASE AUTO_INCREMENT=1
"""
cursor.execute(create_table_sql)
print("Table created successfully")
except MySQLdb.Error as err:
print(err)
def insert_record(table_name, name, age):
with MySQLdb.connect(**OCEANBASE_CONFIG) as conn:
with conn.cursor() as cursor:
try:
insert_sql = f"INSERT INTO {table_name} (name, age) VALUES (%s, %s)"
cursor.execute(insert_sql, (name, age))
conn.commit()
print("Record inserted successfully")
except MySQLdb.Error as err:
print(err)
def select_all(table_name):
with MySQLdb.connect(**OCEANBASE_CONFIG) as conn:
with conn.cursor() as cursor:
try:
select_sql = f"SELECT * FROM {table_name}"
cursor.execute(select_sql)
result = cursor.fetchall()
for row in result:
print(row)
except MySQLdb.Error as err:
print(err)
from db import create_table, insert_record, select_all
def main():
create_table()
while True:
print("Instruction: 1.Insert Data; 2.Query Data; 3.Exit.")
command = input("Enter the command [1/2/3]> ")
if command == "1":
name = input("Enter name:")
age = input("Enter age:")
insert_record("test_tbl1", name, age)
elif command == "2":
select_all("test_tbl1")
elif command == "3":
break
else:
print("Invalid command, please enter command again [1/2/3]")
if __name__ == "__main__":
main()
python-mysqlclient サンプルプロジェクトをダウンロード