Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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プログラマ初心者なんで)
ツールのソースに対して説明して欲しい方はコメント下さい。
(てきとーに答えます)
うくく。