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 を絶対パスで指定すること。
settings.py の DATABASE_NAME を絶対パスで指定すること。