2011年3月16日水曜日

Eclipse上でDjangoとSQLite3を使うときの注意点

Eclipse上でDjangoプロジェクトの実行やデバックが可能だ(以前の記事)。

Python は ver2.5 から、SQLite がパッケージに含まれるようになった。データベースに SQLite を利用したアプリケーションでは、Eclipse 上での実行に関して注意が必要なようだ。データベースが MySQL の場合は特に問題はない。

例えば、Yahoo!Japan の次のページにあるサンプルコードを、 Eclipseで実行しようとするとエラーが出る。

参考: Yahoo!Japan - OpenID AXによるYahoo!プロフィール情報の取得
Traceback:
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\core\handlers\base.py" in get_response
100.                     response = callback(request, *callback_args, **callback_kwargs)
File "C:\Users\xxx\workspace\djopenid\..\djopenid\consumer\views.py" in login
35.             auth_request = c.begin(openid_url)
File "build\bdist.win32\egg\openid\consumer\consumer.py" in begin
344.             service = disco.getNextService(self._discover)
File "build\bdist.win32\egg\openid\yadis\manager.py" in getNextService
100.         manager = self.getManager()
File "build\bdist.win32\egg\openid\yadis\manager.py" in getManager
156.         manager = self.session.get(self.getSessionKey())
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\contrib\sessions\backends\base.py" in get
63.         return self._session.get(key, default)
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\contrib\sessions\backends\base.py" in _get_session
172.                 self._session_cache = self.load()
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\contrib\sessions\backends\db.py" in load
20.                 expire_date__gt=datetime.datetime.now()
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\models\manager.py" in get
132.         return self.get_query_set().get(*args, **kwargs)
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\models\query.py" in get
342.         num = len(clone)
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\models\query.py" in __len__
80.                 self._result_cache = list(self.iterator())
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\models\query.py" in iterator
271.         for row in compiler.results_iter():
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\models\sql\compiler.py" in results_iter
677.         for rows in self.execute_sql(MULTI):
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\models\sql\compiler.py" in execute_sql
732.         cursor.execute(sql, params)
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\backends\util.py" in execute
15.             return self.cursor.execute(sql, params)
File "c:\python25\lib\site-packages\django-1.2.5-py2.5.egg\django\db\backends\sqlite3\base.py" in execute
200.             return Database.Cursor.execute(self, query, params)

Exception Type: DatabaseError at /consumer/login/
Exception Value: no such table: django_session

セッション情報をデータベースに書き込む時に、該当するテーブルが見つけられないという例外が発生している。

しかし不思議なのはプログラムを置いたフォルダーで、(Eclipse内からではなく)コマンドラインから次のように起動させると問題なく動くことである。
python manage.py runserver localhost:8000

この問題は以下のように設定を変更すれば解決できる。

サンプルプログラムの settings.py 中で データベースは次のように設定されている。
DATABASE_ENGINE = 'sqlite3'           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = 'test.db'             # 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.

この内、 DATABASE_NAME の値を絶対パスで指定してあげると、Eclipse上で動かすことができるようになる。
DATABASE_ENGINE = 'sqlite3'           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = 'C:/users/xxx/workspace/djopenid/test.db'             # 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.

まとめ
Eclipse 上で Django 及び SQLite3 を実行・デバックする時は、
settings.py の DATABASE_NAME を絶対パスで指定すること。