データベースを移行する作業があったので、PythonのORマッパ、SQLObjectを使ってみた。
ついでにCSVファイルに出力する標準モジュールも使ってみる。
mysqlのコマンドだけでできる作業のような気がしないでもない...。
まあ、pythonでデータを操作できるし嬉しい、ということで。
SQLObjectの情報は、djangoでもお世話になったこちらのサイトから
http://ymasuda.jp/python/sqlobject/doc_0.7/SQLObject.html
SQLObjectモジュールはPython Cheese Shopからダウンロードしてeasy_installした。
http://cheeseshop.python.org/pypi/SQLObject/0.7.8
csvモジュールの情報はここから
http://www.python.jp/doc/2.4/lib/module-csv.html
SQLObjectがデータベースとテーブル名を指定するだけで自動的に
テーブル構造からモデルのプロパティを作成してくれることに感動。
どちらかというとCSVで日本語を出力する方が良く分からなくて苦労した。
oldtables.py
# vim: fileencoding=cp932 from sqlobject import * OLD_DB_NAME = 'dbname' OLD_DB_USER = 'username' OLD_DB_PASS = 'password' oldcon = connectionForURI("mysql://%s:%s@localhost/%s" % (OLD_DB_USER, OLD_DB_PASS, OLD_DB_NAME)) sqlhub.processConnection = oldcon # companyテーブルからモデルを生成 class Company(SQLObject): class sqlmeta: fromDatabase = True # shohinテーブルからモデルを生成 class Shohin(SQLObject): class sqlmeta: fromDatabase = True
データベースはmysql3.23で、文字コードはshift_jis。
output_csv.py
# vim: fileencoding=cp932 import csv import os import codecs from sqlobject import * from oldtables import * # カレントディレクトリを取得 output_dir = os.getcwd() def output_shohin(): row_list = Shohin.select() file = codecs.open(os.path.join(output_dir, "shohin.csv"), "wb", 'cp932') writer = csv.writer(file) for shohin in row_list: line = [ str(shohin.id), str(shohin.companyID), shohin.shohinName, str(shohin.uriTanka), ] writer.writerow([unicode(value, "cp932") for value in line]) print "shohin出力完了:" + str(row_list.count()) if __name__ == "__main__": output_shohin()
CSVに出力するデータを日本語に変換するところでリスト内包表記を使ってみたけど、
もっとシンプルな書き方がある気がしてならない。他の箇所もそうだけど。