本記事では、mysqlclient と OceanBase データベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、クエリなどの基本的な操作を実現する方法について説明します。
前提条件
- Python 3.xとpipがインストール済みであること。
- OceanBaseデータベースをインストール済みで、MySQLテナントが作成されていること。
手順
- Pythonとpipのバージョンを確認します。
- mysqlclientライブラリをインストールします。
- OceanBaseデータベースの接続情報を取得します。
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はC言語で実装されたMySQLクライアントライブラリで、パフォーマンスが高く、パフォーマンス要件が高いシナリオに適しています。mysqlclientライブラリをインストールする際には、OceanBaseデータベースに接続するためにMySQL C APIをコンパイルおよびリンクする必要があります。
方法1:プリコンパイル済みバイナリファイルを使用したインストール(推奨)
Download filesから、ご使用のPythonバージョンとOSプラットフォームに対応する
whlファイルをダウンロードします。コマンドプロンプトまたはPowerShellターミナルを開き、
whlファイルが保存されているディレクトリに移動して、以下のコマンドを実行してインストールします:pip install mysqlclient-2.2.0-cp311-cp311-win_amd64.whl
方法2:直接インストール
MySQLまたはMySQL Connector/Cをインストールし、開発コンポーネントがインストールされていることを確認します。
Cコンパイラ(Visual StudioやMinGWなど)をインストールします。
以下のコマンドを実行してmysqlclientライブラリをインストールします:
pip install mysqlclient
Python開発パッケージをインストールします:
sudo yum install python3-develMySQL開発ライブラリをインストールします:
sudo yum install mysql-devel以下のコマンドを実行してmysqlclientライブラリをインストールします:
sudo pip install mysqlclient
説明
mysqlclientは高性能なMySQLクライアントライブラリで、パフォーマンス要件が高い本番環境のアプリケーションに適しています。
ステップ3:OceanBaseデータベース接続情報を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、およびSELECT権限が付与されていなければなりません。その他のユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
その他の接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ4:config.pyファイル内のデータベース接続情報を修正する
ステップ3:OceanBaseデータベース接続情報を取得する の情報に基づき、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': '10.10.10.1', 'port': 2881, 'user': 'test_user001@mysql001', 'password': '******', 'database': 'test', 'charset': 'utf8mb4' }- Windows環境では、テキストエディタを使用して
ステップ5: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]>
ステップ6:対話型コマンドラインインターフェースで対応する操作を実行する
データ挿入成功の例。
対話型コマンドラインインターフェースで、コマンド
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': 2881, # デフォルトポート。実際の状況に応じて変更可能
'user': 'user_name',
'password': '',
'database': 'db_name',
'charset': 'utf8mb4'
}
パラメータの説明:
host:OceanBaseデータベースへの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。port:OceanBaseデータベースへの接続ポート。デフォルトは2881です。ODPを使用する場合、デフォルトポートは2883です。user:データベース接続用のユーザー名。直接接続形式:{ユーザー名}@{テナント名}。ODP接続形式:{ユーザー名}@{テナント名}#{クラスタ名}。OceanBaseデータベースへの接続に関する詳細は、接続方式の概要を参照してください。password:データベース接続用のパスワード。database:接続するデータベース名。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': 2881, # デフォルトポート。実際の状況に応じて変更可能。
'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()
エラー処理
mysqlclientを使用してOceanBaseデータベースに接続する際、さまざまなエラーが発生する可能性があります。以下は一般的なエラーとその対処方法です:
接続エラー:データベースに接続できない場合は、ホスト名、ポート、ユーザー名、パスワード、データベース名を含む接続パラメータが正しいかどうか確認してください。
権限エラー:権限に関連するエラーが発生した場合は、ユーザーが必要な操作を実行するための十分な権限を持っていることを確認してください。
SQL構文エラー:SQLステートメントに構文エラーがある場合は、SQLステートメントの構文が正しいかどうか確認してください。
データ型エラー:挿入したデータ型がテーブル定義とマッチしない場合は、挿入したデータ型が正しいことを確認してください。
コード内では、try-except ステートメントを使用してこれらのエラーをキャッチし、処理することで、エラー発生時にプログラムがクラッシュすることなく適切に対処できるようにします。
関連ドキュメント
OceanBaseデータベースへの接続方法の詳細については、接続方法の概要を参照してください。
データベース作成の詳細については、CREATE DATABASEを参照してください。
python-mysqlclient サンプルプロジェクトをダウンロード