さて、DBとテーブルが完成したので早速2年分のCSVデータをテーブルにインポートしようと試みました。チャチャっとSQL文を作ってインポートを終わらせる予定だったのですが……
が、ここで予期せぬ問題にぶつかってしまい、回答を見つけるまで余分な時間を使ってしまったのです。
そもそもファイルを見つけられないと言う問題が発生
CSVデータをテーブルにインポートするには、load data infileと言うSQL文を使えば良いことまで調べてありました。
従って、テータをテーブルにインポートするSQL文は下記の通りに作り、何回も間違っていないか確認し実行したんです。
MariaDB [numbers3]> load data local infile "C:\Users\****\Downloads\numbers3jnb.csv" into table result fields terminated by ',' OPTIONALLY enclosed
by '"';
でも結果は、エラー表示になるんです。しかも、SQL文法の間違いではなく、指定しているファイルが見つからないと言うエラー。
もう一度ファイルの有るパスを確認しましたが問題ありません。しかし、何回やってもfile not foundになってしまうんです。
ハテ?どうしてだろうか?
落とし穴は単純だった
まず最初に見つけたのは、Windowsの場合ディレクトリ記号が¥となっております。しかし、Linuxの場合には/になるんです。
従って、C:\Users\****\Downloads\numbers3jnb.csv"
の部分が、正しくはC:/Users/****/Downloads/numbers3jnb.csv"
になるんですね。
何だ、単純ミスじゃないかと思い書き換えを実施して実行しましたが、相変わらずファイルが見つからないと怒られました。
ずっとSQL文を眺めていて、ハタと気がついたんです。
そうか!SQL文でファイルをインポートする場合、ファイルはローカル側に無ければいけないのだと言う事を。
今、ラズパイ側のMariaDBを動かしており、そのテーブルにCSVファイルをインポートしようとしていて、ファイルの場所を指定しているのはWindows11の場所なんですね。
これではファイルが無いと怒るわけです。
解決策はCSVファイルをラズパイ側のユーザーディレクトリにコピーしてあげれば良いんです。
が、Windows11からラズパイにコピー&ペーストなんかできません。
そこで解決策はFTPでWindows11からラズパイに送り込めば良いと言う事をおもいつきました。
しかし、ここでも問題が!
ラズパイは標準でFTPサーバーは入っていないので、インストールする必要があります。
FTPサーバーをインストールする
それでは想定外の作業としてFTPサーバーをインストールしていきましょう。
ラズパイにインストールするのはvsftpdと言うパッケージになります。
まず最初に、システムのアップデートがあるか確認をして、アップデートがある場合はアップデートして最新の状態にします。
$ sudo apt update
アップデートがあった場合は最新状態にアップデートします。
$ sudo apt upgrade -y
これで最新状態にシステムがなります。次がいよいよFTPサーバーのインストールです。
$ sudo apt install vsftpd
このコマンドを実行すると以下のような表示がでてインストールが完了します。
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています… 完了
状態情報を読み取っています… 完了
以下のパッケージが新たにインストールされます:
vsftpd
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
147 kB のアーカイブを取得する必要があります。
この操作後に追加で 357 kB のディスク容量が消費されます。
取得:1 http://deb.debian.org/debian bullseye/main arm64 vsftpd arm64 3.0.3-12 [147 kB]
147 kB を 0秒 で取得しました (485 kB/s)
パッケージを事前設定しています …
以前に未選択のパッケージ vsftpd を選択しています。
(データベースを読み込んでいます … 現在 98809 個のファイルとディレクトリがインストールされています。)
…/vsftpd_3.0.3-12_arm64.deb を展開する準備をしています …
vsftpd (3.0.3-12) を展開しています…
vsftpd (3.0.3-12) を設定しています …
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /lib/systemd/system/vsftpd.service.
man-db (2.9.4-2) のトリガを処理しています …
完了しましたので、動作環境の設定をします。
動作環境の設定
既にFTPサーバーは稼働していますので、一旦」設定のために停止させます。
$ sudo service vsftpd stop
これでサービスが停止しましたので、現状のオリジナルの設定ファイルをバックアップとしてコピーします。
それではvsftpd.confの設定を一部変更します。
変更するのは以下の3つの項目で、オリジナルでは#でコメントアウトされていますから、この#を取り除きコメントアウトを解除します。
- ユーザ権限設定
- ASCIIモードの設定
- ユーザ権限
それではviエディターを用いて修正をしていきましょう。
ユーザー権限設定
ユーザー権限設定をしているのは下記の3箇所の#を取り除きます。
#local_enable=YES -> local_enable=YES
#write_enable=YES -> write_enable=YES
#local_umask=022 -> local_umask=022
ASCIIモードの設定
ASCIIモードの設定は下記の2箇所を同じく#を外します。
#ascii_upload_enable=YES -> ascii_upload_enable=YES
#ascii_download_enable=YES -> ascii_download_enable=YES
ユーザー権限
ユーザー権限の設定は下記2箇所を同じく#を外します。
#chroot_local_user=YES -> chroot_local_user=YES
#chroot_list_enable=YES -> chroot_list_enable=YES
以上の設定変更が完了したらファイルを書込終了させ、停止していたFTPサーバーを再起動させます。
FTPサーバーの再起動と接続確認
設定ファイルの書き換えのためFTPサーバーは停止させていましたので、再度起動をさせます。
$ sudo service vsftpd start
このコマンドでFTPサーバーは起動します。何かの拍子に電源を切ったりしたとき、電源再投入ではFTPサーバーは自動で立ち上がりませんので、電源投入で自動起動する設定も行っておきます。
$ sudo update-rc.d -f vsftpd defaults
これで電源投入後の自動起動するrc.dと言うファイルに修正が掛かり、電源投入後にFTPサーバーが自動で立ち上がるようになりました。
それでは実際にFTP接続ができるのか、Windows用のFTPアプリを使用してラズパイに接続してみます。
ちゃんと接続ができるようになりました。
後はCSVファイルを転送するだけです。しかし、ここまでで結構な時間を使ってしまいましたので、転送を行ってトラブルが出と対処できないので、転送は後日にします。
まとめ
簡単にデータをインポートできるト思っていましたが、ファイルのある環境がローカルで無ければいけないと言う事に気がつくまで、結構な時間を費やしました。
そこが分かってからも、FTPサーバーが稼働していないとFTP接続ができない等、付帯する小さなトラブルが続出です。
まあ素人なんで、トラブルは付きものですよね。
このトラブルを解決していくことで、経験という資産が増えていくと思います。
前向きに、トラブルを楽しんでいこうと思っております。