- LOAD DATA IN INFILE でUL拒否られる問題
- LOAD DATA INFILE を受け付けてくれなかった、Linux-mint
- LINES TERMINATED BY "\r\n" Linux-mintで行末判断が狂う
- LOCAL と \n の改修でCSVをMariaDB(≒MySQL)へアップロードできました
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できた、という備忘録です。