本記事では、mysqlclient と OceanBase Cloud クラウドデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、データのクエリなどの基本操作を実行する方法について説明します。
前提条件
- Python 3.x および pip がインストールされていること。
- OceanBase Cloud クラウドデータベースのアカウントを登録し、クラスタインスタンスと OceanBase Cloud MySQL互換モードのテナントを作成していること。詳細は、クラスタインスタンスの作成 および テナントの作成 をご参照ください。
操作手順
- Python と pip のバージョンを確認します。
- mysqlclient ライブラリをインストールします。
- OceanBase Cloud クラウドデータベースの接続情報を取得します。
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 Cloud クラウドデータベースに接続するために 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 Cloud クラウドデータベースの接続情報を取得する
OB Cloudコンソール にログインします。インスタンス一覧ページで対象インスタンスの情報を展開し、対象テナントの下で 接続 > 接続文字列を取得 を選択します。
詳細な操作については、接続文字列の取得 をご参照ください。
作成済みの OceanBase Cloud クラウドデータベースに基づいて、以下の URL の対応する情報を入力します。
obclient -h$host -P$port -u$user_name -p$password -D$database_nameパラメータの説明:
$host:OceanBase Cloud クラウドデータベースの接続アドレスを指定します。例:t********.********.oceanbase.cloud。$port:OceanBase Cloud クラウドデータベースの接続ポートを指定します。デフォルトは 3306 です。$database_name:アクセスするデータベース名を指定します。注意
テナントに接続するユーザーは、該当データベースに対する
CREATE、INSERT、およびSELECT権限を持っている必要があります。アカウント権限の詳細については、アカウントの作成と管理 をご参照ください。$user_name:データベースにアクセスするアカウントを指定します。$password:アカウントのパスワードを指定します。
例は以下の通りです。
```shell
obclient -h t********.********.oceanbase.cloud -P3306 -u mysql001 -p****** -Dtest
```
操作手順 4:config.py ファイル内のデータベース接続情報を変更する
手順 3:OceanBase Cloud クラウドデータベースの接続情報を取得する の情報に基づいて、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': 'mysql001', password': '******', database': 'test', charset': 'utf8mb4' }- Windows 環境では、テキストエディタを使用して
操作手順 5:main.py ファイルを実行する
コマンドプロンプトまたは PowerShell ターミナルを開き、python main.py コマンドを実行してプログラムを起動します。
python-mysqlclientプロジェクトディレクトリに移動します。
例は以下の通りです。
```shell
cd /home/admin/python-mysqlclient
```
以下のコマンドを実行して
main.pyプログラムを起動します。python main.py
返される結果は以下の通りです。
```shell
Table created successfully
Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
Enter the command [1/2/3]>
```
操作手順 6:対話型コマンドラインインターフェースで対応する操作を実行する
データの挿入成功例。
- 対話型コマンドラインインターフェースで、コマンド
1を入力し、Enter キーを押します。
- 対話型コマンドラインインターフェースで、コマンド
例は以下の通りです。
```shell
Enter the command [1/2/3]> 1
```
Enter name:のプロンプトが表示されたら、名前を入力し、Enter キーを押します。
例は以下の通りです。
```shell
Enter name:A1
```
Enter age:のプロンプトが表示されたら、年齢を入力し、Enter キーを押します。
例は以下の通りです。
```shell
Enter age:18
```
- データの挿入が成功したことが返され、
Record inserted successfullyと表示されます。最後にコマンドの説明が表示され、ユーザーは1、2、または3を入力して Enter キーを押し、対応する操作を実行できることが示されます。
例は以下の通りです。
```shell
Record inserted successfully
Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
Enter the command [1/2/3]>
```
データの挿入失敗例。
- 対話型コマンドラインインターフェースで、コマンド
1を入力し、Enter キーを押します。
- 対話型コマンドラインインターフェースで、コマンド
例は以下の通りです。
```shell
Enter the command [1/2/3]> 1
```
Enter name:のプロンプトが表示されたら、名前を入力し、Enter キーを押します。
例は以下の通りです。
```shell
Enter name:A2
```
Enter age:のプロンプトが表示されたら、年齢を入力し、Enter キーを押します。注意
年齢フィールドのデータ型は整数型です。
例は以下の通りです。
```shell
Enter age:十八
```
- データの挿入エラー情報が返され、
(1366, 'Incorrect integer value')と表示されます。最後にコマンドの説明が表示され、ユーザーは1、2、または3を入力して Enter キーを押し、対応する操作を実行できることが示されます。
例は以下の通りです。
```shell
(1366, 'Incorrect integer value')
Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
Enter the command [1/2/3]>
```
データのクエリ例。
- 対話型コマンドラインインターフェースで、コマンド
2を入力し、Enter キーを押します。
- 対話型コマンドラインインターフェースで、コマンド
例は以下の通りです。
```shell
Enter the command [1/2/3]> 2
```
- テーブルのデータが表示されます。最後にコマンドの説明が表示され、ユーザーは
1、2、または3を入力して Enter キーを押し、対応する操作を実行できることが示されます。
例は以下の通りです。
```shell
(1, 'A1', 18)
Instruction: 1.Insert Data; 2.Query Data; 3.Exit.
Enter the command [1/2/3]>
```
- 誤ったコマンドの入力例。
- 対話型コマンドラインインターフェースで、
1/2/3以外の値を入力し、Enter キーを押します。
例は以下の通りです。
```shell
Enter the command [1/2/3]> A
```
- エラー情報が返され、
Invalid command, please enter command again [1/2/3]と表示されます。最後にコマンドの説明が表示され、ユーザーは1、2、または3を入力して Enter キーを押し、対応する操作を実行できることが示されます。
例は以下の通りです。
```shell
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 キーを押してプログラムを終了します。
例は以下の通りです。
```shell
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 Cloud クラウドデータベースの接続パラメータを管理するための OCEANBASE_CONFIG という名前の辞書変数が定義されています。
コードは以下の通りです。
OCEANBASE_CONFIG = {
host': '$host',
port': $port,
user': '$user_name',
password': '$password',
database': '$database_name',
charset': 'utf8mb4'
}
パラメータの説明:
$host:OceanBase Cloud クラウドデータベースの接続アドレス。$port:OceanBase Cloud クラウドデータベースの接続ポート。$user_name:データベースにアクセスするアカウント。$password:アカウントのパスワード。$database_name:接続するデータベース名。charset:データベース接続時に使用する文字セット。<main id="notice" type='notice'> <h4>注意</h4> <p>具体的な属性(パラメータ)の設定は、プロジェクトの要件やデータベースの特性に依存します。実際の状況に応じて調整および設定することをお勧めします。</p> </main>
db.py コードの紹介
db.py ファイルは、Python 言語で記述されたデータベース操作をカプセル化するモジュールであり、主にデータベースの追加、削除、変更、クエリ操作を実装するために使用されます。
このファイルには主に以下の部分が含まれています。
- MySQLdb モジュールのインポートとデータベース接続パラメータのインポート。
コードは以下の通りです。
```python
import MySQLdb
from config import OCEANBASE_CONFIG
```
- テーブル作成関数の定義。
関数 create_table を定義します。この関数の役割は、OceanBase Cloud クラウドデータベースに test_tbl1 という名前のテーブルを作成することです。with ステートメントを使用してデータベース接続とカーソルオブジェクトのライフサイクルを管理し、データベース接続とカーソルオブジェクトの安全なクローズを保証し、メモリリークなどの問題を回避します。SQL 文を定義し、SQL 文を実行して、実行結果または例外情報を出力します。
コードは以下の通りです。
```python
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 文を定義し、挿入操作を実行し、トランザクションをコミットして、実行結果または例外情報を出力します。
コードは以下の通りです。
```python
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 文を定義し、クエリ操作を実行してクエリ結果を反復処理し、すべてのレコードを出力します。例外が発生した場合は、例外をキャッチして例外情報を出力します。
コードは以下の通りです。
```python
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 つの関数をインポートします。
コードは以下の通りです。
```python
from db import create_table, insert_record, select_all
```
データベース操作用関数の定義。
関数
mainを定義します。この関数は、データベースを操作するためのシンプルなコマンドライン対話型プログラムを実装します。まずcreate_table関数を呼び出してtest_tbl1という名前のテーブルを作成し、次にwhileループに入ってユーザーのコマンド入力を待ちます。ユーザーの選択に応じて、プログラムは異なる関数を呼び出して挿入またはクエリ操作を実行し、ユーザーが3コマンドを入力してプログラムを終了するまで繰り返します。ユーザーが無効なコマンドを入力した場合、プログラムはユーザーに再入力を促します。入力されたコマンドに応じて、プログラムはデータの挿入(1)、データのクエリ(2)、プログラムの終了(3)などの異なる操作を実行します。
コードは以下の通りです。
```python
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関数は実行されません。
コードは以下の通りです。
```python
if __name__ == "__main__":
main()
```
<main id="notice" type='explain'>
<h4>説明</h4>
<p>この記述方法により、モジュールをインポートした際に <code>main</code> 関数が自動的に実行されるのを防ぎ、プログラムの再利用性と拡張性を確保できます。</p>
</main>
完全なコードの表示
OCEANBASE_CONFIG = {
host': 't********.********.oceanbase.cloud',
port': 3306, # デフォルトポート。実際の状況に応じて変更可能
user': 'user_name',
password': '',
database': 'db_name',
charset': 'utf8mb4'
}
```python
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)
```
```python
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 Cloud クラウドデータベースに接続する際、さまざまなエラーが発生する可能性があります。以下は、一般的なエラーとその処理方法です。
接続エラー:データベースに接続できない場合は、ホスト名、ポート、ユーザー名、パスワード、データベース名などの接続パラメータが正しいか確認してください。
権限エラー:権限に関連するエラーが発生した場合は、ユーザーが必要な操作を実行するための十分な権限を持っていることを確認してください。
SQL 構文エラー:SQL 文に構文エラーがある場合は、SQL 文の構文が正しいか確認してください。
データ型エラー:挿入するデータ型がテーブル定義と一致しない場合は、挿入するデータ型が正しいか確認してください。
コード内では、try-except ステートメントを使用してこれらのエラーをキャッチおよび処理し、エラーが発生した際にプログラムが直接クラッシュするのではなく、適切に処理できるようにしています。
関連情報
- OceanBase Cloud クラウドデータベースへの接続に関する詳細情報は、接続方法の概要 をご参照ください。