Linux Ubuntu python MySQL(XAMPP)接続(ソースコード)

目次

仮想環境作成

venv パッケージがあるか確認(標準搭載のはず)

sudo apt update
sudo apt install python3-venv -y

プロジェクトディレクトリ作成

mkdir myproject
cd myproject

仮想環境作成(プロジェクトディレクトリにて作成)

python3 -m venv myenv

仮想環境の有効化

source myenv/bin/activate

仮想環境の無効化(終了)

作業が終わったら以下で無効化します。

deactivate

ライブラリインストール

PIP インストール

sudo apt update
sudo apt install python3-pip

MySQL コネクター

sudo apt update
pip install mysql-connector-python

Excel 読み取り pands openpyxl

sudo apt update
pip install pandas openpyxl

Vs Codeで、仮想環境を認識する

VS Code で myproject フォルダを開く

Ctrl+Shift+P → 「Python: Interpreter を選択」→ ./myenv/bin/python を選択

python MySQL ソースコード

データベースの条件(必要に応じてソースコードを変更)

データベース名:eng001
ユーザー;root
パスワード:root
ホスト名:

ソースコード

# pip install mysql-connector-python
import mysql.connector
from mysql.connector import Error
import pandas as pd
import openpyxl
#
#  DSN(Data Source Name)を使用して接続設定を取得
# dsn(host='locakhost', user='root', password="root", database='mysql', port=3306)
def dsn(host, user, password, database, port=3306):
    config = {
        'host': host,
        'user': user,
        'password': password,
        'database': database,
        'port': port
    }
    return config

def dsn_admin(): 
    config = {
        'host': 'localhost', # MySQL Server のホスト名または IP アドレス
        'user': 'root', # MySQL のユーザー名
        'password': 'root', # MySQL のパスワード
        'database': 'eng001', # 接続するデータベース名
        'port': 3306 # MySQL のポート番号(デフォルトは 3306)
    }
    return config

def dsn_user(): 
    config = {
        'host': 'localhost',
        'user': 'db_user',
        'password': 'db_user',
        'database': 'eng001',
        'port': 3306
    }
    return config
    
def test_connection():
    try:
        dsn_config = dsn_user()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                print("✅ MySQL に接続できました!")
                server_info = connection.get_server_info()
                print("MySQL Server バージョン:", server_info)

    except Error as e:
        print("❌ 接続エラー:", e)

def create_database():
    try:
        dsn_config = dsn_admin()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    strsql = """
                        CREATE DATABASE eng001p 
                        DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
                    """
                    cursor.execute(strsql)
                    connection.commit()
                    print("✅ データベースが作成されました。")

    except Error as e:
        print("❌ エラー:", e)
        
def drop_database():
    try:
        dsn_config = dsn_admin()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    strsql = "DROP DATABASE IF EXISTS eng001p;"
                    cursor.execute(strsql)
                    connection.commit()
                    print("✅ データベースが削除されました。")

    except Error as e:
        print("❌ エラー:", e)


def create_user_grant():
    try:
        dsn_config = dsn_admin()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    # ユーザーの作成
                    cursor.execute("CREATE USER 'db_user'@'%' IDENTIFIED BY 'db_user';")
                    # 権限の付与
                    cursor.execute("GRANT ALL PRIVILEGES ON eng001.* TO 'db_user'@'%';")
                    connection.commit()
                    print("✅ ユーザーと権限が作成されました。")

    except Error as e:
        print("❌ エラー:", e)


def create_table_user_master():
    try:
        dsn_config = dsn_user()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    strSql = """
                        CREATE TABLE IF NOT EXISTS user_master (
                            id CHAR(16) NOT NULL PRIMARY KEY,
                            name TEXT,
                            pass TEXT,
                            mail TEXT,
                            rights INT
                        );
                    """
                    cursor.execute(strSql)
                    connection.commit()
                    print("✅ テーブルが作成されました。")

    except Error as e:
        print("❌ エラー:", e)


def drop_table_user_master():
    try:
        dsn_config = dsn_user()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    strSql = "DROP TABLE user_master;"
                    cursor.execute(strSql)
                    connection.commit()
                    print("✅ テーブルが削除されました。")

    except Error as e:
        print("❌ エラー:", e)

def add_user_master():
    try:
        dsn_config = dsn_user()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    data = [
                        ("user000", "三田 さやか", "pas000", "user00@gmail.com", 0),
                        ("user001", "須田 翼",     "pas001", "mail01@gmail.com", 1),
                        ("user002", "前田 直行",   "pas002", "mail02@gmail.com", 1),
                        ("user003", "須田 翼",     "pas003", "mail03@gmail.com", 1),
                        ("user004", "林 香奈子",   "pas004", "mail04@gmail.com", 1),
                        ("user005", "中川 修子",   "pas005", "mail05@gmail.com", 1),
                    ]

                    strSql = """
                        INSERT INTO user_master (id, name, pass, mail, rights)
                        VALUES (%s, %s, %s, %s, %s)
                    """

                    cursor.executemany(strSql, data)
                    connection.commit()
                    print("✅ データが追加されました。")

    except Error as e:
        print("❌ エラー:", e)

def select_user_master():
    try:
        dsn_config = dsn_user()
        with mysql.connector.connect(**dsn_config) as connection:
            if connection.is_connected():
                with connection.cursor() as cursor:
                    strSql = "SELECT * FROM user_master;"
                    cursor.execute(strSql)
                    result = cursor.fetchall()

                    for row in result:
                        print(row)

    except Error as e:
        print("❌ エラー:", e)

def insert_users_from_excel(file_path):
    # Excelからデータを読み込み
    df = pd.read_excel(file_path, engine='openpyxl')

    # 欠損値チェック
    if df.isnull().values.any():
        print("⚠️ Excelに欠損データがあります。")
        return

    # 登録用のタプルリストに変換
    records = list(df.itertuples(index=False, name=None))

    dsn_config = dsn_user()

    try:
        with mysql.connector.connect(**dsn_config) as connection:
            connection.autocommit = False
            if connection.is_connected():
                with connection.cursor() as cursor:
                    sql = """
                        INSERT INTO user_master (id, name, pass, mail, rights)
                        VALUES (%s, %s, %s, %s, %s)
                    """
                    cursor.executemany(sql, records)
                    connection.commit()
                    print("✅ Excelからのデータ登録完了")

    except mysql.connector.Error as e:
        print("❌ エラー:", e)
        # ロールバックは接続確認後に限定
        try:
            if 'connection' in locals() and connection.is_connected():
                connection.rollback()
                print("🔁 ロールバックしました。")
        except:
            pass


def test_transaction():
    try:
        # DSN(Data Source Name)を使用して接続設定を取得
        dsn_config = dsn_user()
        connection = mysql.connector.connect(**dsn_config)

        if connection.is_connected():
            print("✅ MySQL に接続できました!")
            server_info = connection.get_server_info()
            res = connection.cmd_query("SHOW TABLE STATUS WHERE Name = 'user_master';")
            print("テーブル情報:", res)
            print("MySQL Server バージョン:", server_info)

    except Error as e:
        print("❌ 接続エラー:", e)

    finally:
        if 'connection' in locals() and connection.is_connected():
            connection.close()
            print("🔒 接続を閉じました。")

# エントリーポイント
if __name__ == "__main__":
    test_connection()
    # create_database()
    # create_user_grant()
    # drop_database()
    # drop_table_user_master()
    create_table_user_master()
    add_user_master()
    select_user_master()
    # 実行(ファイルパスを指定)
    # insert_users_from_excel("book1.xlsx")
    
よかったらシェアしてね!
目次