本記事では、mysqlclientとOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、クエリなどの基本的な操作を実行する方法を紹介します。
前提条件
- Python 3.xとpipがインストール済みであること。
- OceanBaseデータベースがインストール済みで、MySQLモードのテナントが作成されていること。
操作手順
- Pythonとpipのバージョンを確認します。
- mysqlclientライブラリをインストールします。
- OceanBaseデータベースの接続情報を取得します。
config.pyファイル内のデータベース接続情報を修正します。main.pyファイルを実行します。- インタラクティブなコマンドラインインターフェース(CLI)で対応する操作を実行します。
ステップ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:インタラクティブなCLIで対応する操作を実行する
データ挿入に成功した場合の例。
インタラクティブなコマンドラインインターフェース(CLI)でコマンド
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]>
データ挿入に失敗した場合の例。
インタラクティブなCLIでコマンド
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]>
データ検索の例。
インタラクティブなCLIでコマンド
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]>
不正なコマンドが入力された場合の例。
インタラクティブなコマンドラインインターフェース(CLI)で
1/2/3以外の値を入力し、Enterキーを押します。例は以下のとおりです:
Enter the command [1/2/3]> AInvalid 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]>
プログラムを終了する時の例。
インタラクティブなコマンドラインインターフェース(CLI)でコマンド
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ライブラリが示されています。説明
本記事で提供されるコードの
requirements.txtには、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サンプルプロジェクトをダウンロード