ipywidgetsを利用してJupyter notebook上でWebFormからMySQLを参照・更新するアプリを作る。

ipywidgetsライブラリを利用してJupyter notebook上でWebFormを直接実行するアプリが作れます。できるだけJupyter notebook(あるいはJupyter lab)から出ずに作業を続けたい場合などに便利です。データを可視化したグラフのパラメーターをリアルタイムに可変させたりする例がネット上にたくさん出ています。
ipywidgetsとBokeh使ってインタラクティブな可視化をする - Qiita

 

今回は、notebookから直接MySQL上のレコードを中身を表示したり、レコードを更新する簡単なアプリを作ってみました。もちろんコードはChatGPTやBing Chatを利用して作成してます。

 

仕様:
  1. mysqlに接続する。
  2. 接続する先は DB名:numinfo の テーブル名: info
  3. infoテーブルは、id、natural_number、explanation というカラムを持つ。
  4. idはkey、natural_numberはint型で自然数、explanationはtext型である。
  5. 機能1: Formで指定した内容を表示する。例:natural_number=3の explanationに格納された情報を表示する。
  6. 機能2: Formに入力した内容をmysqlに反映する。例:natural_number=3のexplanationに「〇〇〇」という文字列を上書き。新規であれば新しいレコードを作成して登録する。既存のレコードがあれば上書きする。

 

コード:

import mysql.connector
import ipywidgets as widgets
from IPython.display import display

# MySQL接続情報
db_config = {
    'user': 'your_username',
    'password': 'your_password',
    'host': 'localhost',
    'database': 'numinfo'
}

# MySQLに接続する関数
def connect_to_mysql():
    try:
        conn = mysql.connector.connect(**db_config)
        return conn
    except mysql.connector.Error as err:
        print(f"Error connecting to MySQL: {err}")
        return None

# 指定した自然数の説明を表示する関数
def display_explanation(natural_number):
    conn = connect_to_mysql()
    if conn:
        cursor = conn.cursor()
        query = f"SELECT explanation FROM info WHERE natural_number = {natural_number}"
        cursor.execute(query)
        result = cursor.fetchone()
        if result:
            print(f"Explanation for natural_number {natural_number}: {result[0]}")
        else:
            print(f"No explanation found for natural_number {natural_number}")
        cursor.close()
        conn.close()

# 指定した自然数の説明をMySQLに保存する関数
def save_explanation(natural_number, explanation):
    conn = connect_to_mysql()
    if conn:
        cursor = conn.cursor()
        query = f"SELECT id FROM info WHERE natural_number = {natural_number}"
        cursor.execute(query)
        result = cursor.fetchone()
        if result:
            # 既存のレコードがある場合は更新
            update_query = f"UPDATE info SET explanation = '{explanation}' WHERE id = {result[0]}"
            cursor.execute(update_query)
            conn.commit()
            print(f"Explanation for natural_number {natural_number} updated")
        else:
            # 新しいレコードを作成して保存
            insert_query = f"INSERT INTO info (natural_number, explanation) VALUES ({natural_number}, '{explanation}')"
            cursor.execute(insert_query)
            conn.commit()
            print(f"New record created for natural_number {natural_number}")
        cursor.close()
        conn.close()

# フォームの作成
natural_number_input = widgets.IntText(value=0, description='Natural Number:')
explanation_input = widgets.Textarea(value='', description='Explanation:')
display(widgets.VBox([natural_number_input, explanation_input]))

# ボタンクリック時の処理
def button_click_handler(button):
    natural_number = natural_number_input.value
    explanation = explanation_input.value
    save_explanation(natural_number, explanation)

save_button = widgets.Button(description='Save')
save_button.on_click(button_click_handler)
display(save_button)

# 自然数に対する説明を表示するボタンの作成とクリック時の処理
display_button = widgets.Button(description='Display Explanation')
display_output = widgets.Output()  # 結果を表示する出力領域を作成

def display_button_click_handler(button):
    natural_number = natural_number_input.value
    with display_output:
        display_explanation(natural_number)

display_button.on_click(display_button_click_handler)
display(widgets.VBox([display_button, display_output]))
結果:

以下のように成功しました。ターミナルに移動してsql文を直接たたくのと大差がないかもしれませんが、それすら億劫な場合に。