[Python] 276 MySQLをpipでPythonのマイクロバージョン毎にインストール

[macOS Catalina 10.15.7]

pyenvでpipを使ったMySQLモジュールのインストールコマンド例は以下のようになります。

モジュール名がmysqlではなくてmysql-connector-pythonなので注意が必要です。

Python 3.9.X毎にライブラリを管理する場合
(pythonコマンドをマイクロバージョン毎に変える必要がある)

/Users/xxx/.pyenv/versions/3.9.5/bin/python -m pip install mysql-connector-python

<インストール先>
/Users/xxx/.pyenv/versions/3.9.5/lib/python3.9/site-packages

Python 3.9でまとめて管理する場合
(1.which python → /Users/xxx/.pyenv/shims/python
2.python –version → Python3.9.X を事前確認する)

python -m pip install mysql-connector-python

<インストール先>
/Users/xxx/.local/lib/python3.9/site-packages

[Python] 275 MySQLでIF EXISTSが機能しない

MySQLでテーブルを一旦削除してから新たに作成する操作をする際、テーブルが存在しなくてもエラーにならないようSQL文に”IF EXISTS”を付けたのですが機能しません。

SQL文作成はf文字列でもformatメソッドでもNGでした。

仕方がないので、エラーを無視してtry-except-finallyでテーブルを作成するようにしました。

原因は不明ですが、mysql.connectorモジュールがおかしいのでしょうか。

import csv,mysql.connector,glob
import pandas as pd

<中略>

# sqlのリストを作成
sql_l = list()
for table in table_l:
    sql = f"DROP TABLE IF EXISTS horse_race_name.{table}"
    sql_l.append(sql)

sql_l2 = list()
for table in table_l:
    sql = f"CREATE TABLE horse_race_name.{table} {column_l_str}"
    sql_l2.append(sql)

# mysqlに接続
conn = mysql.connector.connect(**config)
cur = conn.cursor()

# データベースhorse_race_nameにtableを作成する
for file,table,sql,sql2 in zip(file_l,table_l,sql_l,sql_l2):
    try:
        cur.execute(sql)
    except Exception as e:
        print(e)
    finally:
        try:
            cur.execute(sql2)
        except Exception as e:
             print(e)
        else:
            cur.execute('BEGIN')

            # CSVファイルを読み込み、各行をtableに挿入する
            with open(file, 'rt', encoding='Shift-JIS') as f:
                reader = csv.reader(f)
                for i,row in enumerate(reader):
                    if i != 0:
                        row_str = str(row).replace('[','(').replace(']',')')
                        sql3 = f'INSERT INTO horse_race_name.{table} VALUES {row_str}'
                        cur.execute(sql3)

            cur.execute('COMMIT')

conn.close()

[Python] 274 CSVファイル完全一致検索の高速化検討

誕生年単位の馬名ファイルとCSVファイル内の馬名との完全一致検索を実行するコードです。[Python] 229にも似たようなコードを書いています。

実行時間が結構かかり、改善の余地ありです。C言語でモジュールを書いたらどれだけ早くなるか、試してみたいです。

import csv
import pandas as pd

<中略>

with open (file_new_pre, mode="r", encoding="shift_jis") as f3:
    with open (file_new, mode="a", encoding="shift_jis") as f4:
        writer = csv.writer(f4)

        for i,row in enumerate(csv.reader(f3)):
            if i != 0:
                if int(year) >=2001: # 満年齢
                    birthyear = int(year) - int(re.sub("\\D", "", row[4]))
                else: # 2000年以前は数え年
                    birthyear = int(year) - int(re.sub("\\D", "", row[4])) + 1

                # 誕生年馬名ファイル
                namefile = f'horse{birthyear}.csv'
                
                try:
                    df = pd.read_csv(namefile,encoding="shift_jis")
                except:
                    horseID = '198500000'
                else:
                    # 馬名ファイル各行の馬名とレースファイルの馬名が完全一致する場合にTrueとする配列を作成
                    b_array = df[df.columns[1]]==row[3]

                    # ブール値の配列として取り出しリスト化
                    b_array_v = b_array.values.tolist()

                    # Trueのインデックス値を取得
                    try:
                        i = b_array_v.index(True)
                    except: # 該当なし
                        horseID = '100000000'
                    else: # horseID取得
                        horseID = df.iloc[i,0]

                rows = row[0:22] + [horseID]
                writer.writerow(rows)

            else: # タイトル行(0行目)
                rows = row[0:22] + ['horseID']
                writer.writerow(rows)

[Python] 273 macOSのデスクトップ通知

処理に時間がかかる場合は、待っている間に他のことができるよう通知設定しています。

目立たせるため、関数にしました。

import os

# Macのデスクトップ通知
def notification():
    os.system("osascript -e 'display notification \"〇〇チェック\nコード実行終了\"'")

notification()