ほんじゃらねっと

ダイエット中プログラマのブログ

SQLObjectで昔作ったデータベースのデータを取り出してCSVファイルに落とす

データベースを移行する作業があったので、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に出力するデータを日本語に変換するところでリスト内包表記を使ってみたけど、
もっとシンプルな書き方がある気がしてならない。他の箇所もそうだけど。