Doge log

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

続・database APIを使った対話型クライアント

http://d.hatena.ne.jp/mopemope/20060129/1138545434
う・・・。なんてヘタレなコードだったんだ。
もうちょっと改造

#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

source = ''
for line in inspectdb(DATABASE_NAME):
    if(line[:1] != '#' and line[:1] != ''):
        print line
        source += line+'\n'
exec compile(source, '<string>', 'exec')

me = sys.modules[__name__]
dict = me.__dict__

from django.models import *
import code
code.interact(None, None, dict)

改良点

  • だっさいmodelファイルでなくなりました。
  • modelのクラス名がファンキーになるので画面に出力するようにした。

チュートリアルのモデルを参考に実行。
結果

C:\>python console.py
from django.core import meta
class AuthGroup(meta.Model):
    id = meta.IntegerField()
    name = meta.CharField(maxlength=80)
    class META:
        db_table = 'auth_groups'
class AuthGroupsPermission(meta.Model):
    id = meta.IntegerField()
    group_id = meta.IntegerField()
    permission_id = meta.IntegerField()
    class META:
        db_table = 'auth_groups_permissions'
class AuthMessage(meta.Model):
    id = meta.IntegerField()
    user_id = meta.IntegerField()
    message = meta.TextField()
    class META:
        db_table = 'auth_messages'
class AuthPermission(meta.Model):
    id = meta.IntegerField()
    name = meta.CharField(maxlength=50)
    package = meta.CharField(maxlength=20)
    codename = meta.CharField(maxlength=100)
    class META:
        db_table = 'auth_permissions'
class AuthUser(meta.Model):
    id = meta.IntegerField()
    username = meta.CharField(maxlength=30)
    first_name = meta.CharField(maxlength=30)
    last_name = meta.CharField(maxlength=30)
    email = meta.CharField(maxlength=75)
    password = meta.CharField(maxlength=128)
    is_staff = meta.BooleanField()
    is_active = meta.BooleanField()
    is_superuser = meta.BooleanField()
    last_login = meta.DateTimeField()
    date_joined = meta.DateTimeField()
    class META:
        db_table = 'auth_users'
class AuthUsersGroup(meta.Model):
    id = meta.IntegerField()
    user_id = meta.IntegerField()
    group_id = meta.IntegerField()
    class META:
        db_table = 'auth_users_groups'
class AuthUsersUserPermission(meta.Model):
    id = meta.IntegerField()
    user_id = meta.IntegerField()
    permission_id = meta.IntegerField()
    class META:
        db_table = 'auth_users_user_permissions'
class ContentType(meta.Model):
    id = meta.IntegerField()
    name = meta.CharField(maxlength=100)
    package = meta.CharField(maxlength=20)
    python_module_name = meta.CharField(maxlength=50)
    class META:
        db_table = 'content_types'
class CoreSession(meta.Model):
    session_key = meta.CharField(maxlength=40)
    session_data = meta.TextField()
    expire_date = meta.DateTimeField()
    class META:
        db_table = 'core_sessions'
class DjangoAdminLog(meta.Model):
    id = meta.IntegerField()
    action_time = meta.DateTimeField()
    user_id = meta.IntegerField()
    content_type_id = meta.IntegerField()
    object_id = meta.TextField()
    object_repr = meta.CharField(maxlength=200)
    action_flag = meta.TextField() # This is a guess!
    change_message = meta.TextField()
    class META:
        db_table = 'django_admin_log'
class Package(meta.Model):
    label = meta.CharField(maxlength=20)
    name = meta.CharField(maxlength=30)
    class META:
        db_table = 'packages'
class PollsChoice(meta.Model):
    id = meta.IntegerField()
    poll_id = meta.IntegerField()
    choice = meta.CharField(maxlength=200)
    votes = meta.IntegerField()
    class META:
        db_table = 'polls_choices'
class PollsPoll(meta.Model):
    id = meta.IntegerField()
    question = meta.CharField(maxlength=200)
    pub_date = meta.DateTimeField()
    class META:
        db_table = 'polls_polls'
class Site(meta.Model):
    id = meta.IntegerField()
    domain = meta.CharField(maxlength=100)
    name = meta.CharField(maxlength=50)
    class META:
        db_table = 'sites'
Python 2.4.2 (#67, Sep 28 2005, 12:41:11) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
>>> dir()
['AuthGroup', 'AuthGroupsPermission', 'AuthMessage', 'AuthPermission', 'AuthUser
', 'AuthUsersGroup', 'AuthUsersUserPermission', 'ContentType', 'CoreSession', 'D
ATABASE_ENGINE', 'DATABASE_HOST', 'DATABASE_NAME', 'DATABASE_PASSWORD', 'DATABAS
E_PORT', 'DATABASE_USER', 'DjangoAdminLog', 'Package', 'PollsChoice', 'PollsPoll
', 'Site', '_MODELS', '__builtins__', '__doc__', '__file__', '__name__', 'auth',
 'authgroups', 'authgroupspermissions', 'authmessages', 'authpermissions', 'auth
users', 'authusersgroups', 'authusersuserpermissions', 'code', 'contenttypes', '
core', 'coresessions', 'dict', 'djangoadminlogs', 'inspectdb', 'line', 'me', 'me
ta', 'os', 'packages', 'pollschoices', 'pollspolls', 'sites', 'source', 'sys']
>>> p = pollspolls.get_list()
>>> [a.id for a in p]
[1, 2, 3]
>>> [a.question for a in p]
["What's up?", 'Test', 'Poll3']
>>> from datetime import datetime
>>> p = pollspolls.PollsPoll(question="It's New!!", pub_date=datetime.now())
>>> p.save()
>>> p = pollspolls.get_list()
>>> [a.question for a in p]
["What's up?", 'Test', 'Poll3', "It's New!!"]
>>>

SQLを知らなくてもAPIだけで操作できてます。
FK系は問題ないかと思ってたけど吐かれるmodelのソースを見るとFK系は無理みたい。
残念。
うくく。