pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

Pythonスクリプト移植(4):CSVをMySQLへ送るSQL文でコケる


Win11で動いたPythonスクリプトをLinux-mintに移植しようと画策しました。今回は、4回目で、主にMySQL(≒MariaDB)へCSVファイルをアップロードする際のアレコレの備忘録です。

LOAD DATA IN INFILE でUL拒否られる問題

Windowsでは快適にULしてくれた「LOAD DATA IN INFILE」です。しかし、Linux-mintではエラーになりました。Linuxは書き込み権限などが厳しめ、とネット上で見た気もします。なので、権限関係だろうかと爺は妄想しながら最初作業しました。

Linux-mintでエラー吐かれたPythonスクリプトのSQL部分、以下の通りです。

    sql = f'''LOAD DATA INFILE "{fd}{fn}" INTO TABLE market
    FIELDS TERMINATED BY "\t" OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY "\r\n"
    (@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13)
    SET
        date = @1,
        cd   = @2,
        unit = @3,
        mo   = NULLIF(@4, ''),
        mh   = NULLIF(@5, ''),
        ml   = NULLIF(@6, ''),
        mc   = NULLIF(@7, ''),
        ao   = NULLIF(@8, ''),
        ah   = NULLIF(@9, ''),
        al   = NULLIF(@10, ''),
        ac   = NULLIF(@11, ''),
        vw   = NULLIF(@12, ''),
        vol  = NULLIF(@13, ''); 
    '''

プレースホルダを使った書き方もありますが、今回はこちらにて…。
東証株式相場表データ(日報)の大部分をRDBに収めようという内容です。f文を使いCSVファイル(="{fd}{fn}" )を market テーブルに爆速でUPしようとしてます。LOAD DATA INFILE は本当に速いですよね。
でも、このままでは、Linux-mintではNGでした。

LOAD DATA INFILE を受け付けてくれなかった、Linux-mint

Windowsでは普通に動いてました。直さないままLinux-mintで試すと、拒否されました。

フォルダ、ユーザ、RDB、仮想環境などLinux-mintで権限に絡みそうなポイントはいくつかあります。root権限でもエラー吐かれるって、どんだけ拒否られてるんだ、と悲嘆にくれる爺…。

昔ムカシ、サイトにファイル上げるときFTPソフトのお世話になってました。フォルダにどのようにアクセス(読み書き実行)できるか数字で権限設定してたのを思い出し、フォルダ・パーミッション確認しました。特段、拒否されるカンジは無かったです。RDBもphpMyAdminで普通に操作できるので、問題ないはず…。

最後に、手もとのMySQLの本「標準MySQL改訂版」(2005年8月初版、ソフトバンクパブリッシング発行)を読み返し…。何やらオプションがあるのに気づき、「LOCAL」の一語が目に留まり挿入し試したら、UL成功しました。
部分ですが↓

LOAD DATA LOCAL INFILE

LINES TERMINATED BY "\r\n" Linux-mintで行末判断が狂う

前項改修後UL試すも失敗。次の問題は、ULできるが一行目だけ、という内容…。

直さず使ったら、一行目の銘柄データはUPされましたが、他の三千余行は、RDB上には影も形もなし…。以前、AI-Copilot にLinux-mintで扱う行末のマークは「\n」だと教えてもらってたのを思い出し、直しました。

  • Windowsの行末は「\r\n」です。
  • Linux-mintの行末は「\n」です。

LOCAL と \n の改修でCSVをMariaDB(≒MySQL)へアップロードできました

ふたつの改修後、UL試したら成功。これでめでたしめでたしの結果になりました。

PythonスクリプトをWindowsからLinux-mintへ移植しようとする際、MySQL+LOAD DATA でエラーが出る原因はほかにもありそうですが、今回爺はこれでULできた、という備忘録です。