database APIを使った対話型クライアント
ActiveRecordを使った対話型のMySQLクライアントみたいなことをPythonでもできないなかなーと模索。
RoRに出来てDjangoに出来ないことはない!
僕がDjangoを一番使えるんだ!!(ウソ)
というわけでDjangoの機能を使って実現してみる。
(かなりてきとー)
一応SQL叩かなくてもDB操作できそう。
前提
- Django 0.91をインストールしていること
- 使用したいDBのアダプターをインストールしていること
以下ツールのソース。コマンドラインからでなくソースのsettingの部分をそのままいじってください。
#setting DATABASE_ENGINE = '' # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. DATABASE_NAME = '' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. import os import sys os.environ['DJANGO_SETTINGS_MODULE'] = __name__ from django.core.management import inspectdb file = 'model.py' o = open(file, 'w') for line in inspectdb('django'): if(line[:1] != '#' and line[:1] != ''): o.write(line) o.write('\n') o.close() execfile(file) me = sys.modules[__name__] dict = me.__dict__ from django.models import * import code code.interact(None, None, dict)
compile_commandの使い方がわからんかった・・・・。丸二日悩んだけどわからん。
(仕方ないのでリバース結果をファイルに保存してます。)
で実行してみます。
実行後、即インタプリターが起動します。
全てimport済みなので即コードを叩いてください。
ではDjangoが持ってるテーブルSiteにアクセス。
>>> s = sites.get_list() >>> s >>> [<Site object]> >>> dir(s) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__','__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', ' __le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>>
ちゃんと動いてるようです。
Djangoのdatabase APIを知らないとハッキリいって使えないかも知れませんが。
既存のDBにテストデータを作成したい場合などscriptでちょろちょろできるのはけっこー楽かも知れません。
えーっと本来ならばActiveRecordに対応するならSQLObjectでやるべきなんでしょうけど。SQLObjectの自動生成は”属性から”という仕様らしいのでちょっときつい。
一応やる場合には
class Person(SQLObject): _fromDatabase = True
こんな感じで書いておくと勝手に追加してくれるらしい。
調べる余地ありなので機会があればまたそのうち。
もっと凄く簡単にできるぜい!って方教えてください。
(Pythonプログラマ初心者なんで)
ツールのソースに対して説明して欲しい方はコメント下さい。
(てきとーに答えます)
うくく。