MySQLサーバーに外部からテキストファイルを読み取らせ、データベースのテーブルにインポートする場合、LOAD DATA LOCAL INFILE命令を使う。PHPのPDOクラスでこの命令を実行するためには、attributeオプションとして、「PDO::MYSQL_ATTR_LOCAL_INFILE => true」の設定と、SQL ステートメントを実行するPDO::exec()の命令が必要で、これを理解するのに一苦労した。(参照:さくらインターネットでMySQLを使って動的チャートを作成する)
ではPythonではどうだろうか? LOAD DATA LOCAL INFILE命令が素直に使えるかローカルホストで確認してみた。
使用プログラム:
# python-loadfile.py
# mysqlclientライブラリのインポート
import MySQLdb
# データベースへの接続とカーソルの生成
connection = MySQLdb.connect(
host='localhost',
port=3306,
user='miyasan',
passwd='***********',
db='climate',
# local_infile=True #不要
)
cursor = connection.cursor()
query = 'LOAD DATA LOCAL INFILE "slice-data.csv" INTO TABLE iida_agri_sensor_slice FIELDS TERMINATED BY "," ;'
cursor.execute( query )
results = connection.info() # Recode挿入情報
print(results)
connection.commit() ## #1データ保存コミット
connection.close()
# #1reference: MySQL Python developper Guide
# https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-commit.html
なんとこれだけであっさりと動作してしまった。ネット検索をすると、接続時のオプションとして「local_infile=True」が必要のようなことも書いてあったので、オプションありなしで試したが不要であった。注意しなければならないことは、SELECT構文と異なり、データをあらたに保存するなどデータベースのModifyがある場合は、query実行後にcommit()命令が必須である。
コミット前のquery結果は「connection.info()」で取得できる。
レコードが新たに挿入された場合 Records: 41717 Deleted: 0 Skipped: 0 Warnings: 0 重複レコードを挿入しようとした場合: Records: 41717 Deleted: 0 Skipped: 41717 Warnings: 41717
先に作成したデータスライスのプログラムと合わせれば、PHPを使わなくともデータベースのデータ管理ができそうである。
コメント