続・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系は無理みたい。
残念。
うくく。