ホームページをリニューアルしました。旧HPはこちら
MySQL ソフト・ハードウェア Python

PythonによるMySQLへのデータファイルインポート(3/4)

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を使わなくともデータベースのデータ管理ができそうである。

 

コメント

タイトルとURLをコピーしました