hapter5のサンプルでテストがうまく動作しない

2009年02月15日(日) 21:41

return to Django×Python

GeoDjangoを使ったテストはいくつかの追加設定が必要です。

  • TEST_RUNNERをgeodjangoのものに変更する

Djangoはテスト実行(manage.py test)時にテストを行う機構を変更できます。GeoDjangoはいくつかの事前準備がひつようなため、geodjangoを使ったアプリケーション用のテスト機構が付属します。

settings.pyにTEST_RUNNERの設定を行います:

TEST_RUNNER='django.contrib.gis.tests.run_tests'
  • テスト時に利用するデータベースユーザにSUPERUSER特権を付ける

    postgisのデータベーステンプレートをコピーしてデータベースを作成しますので、PostgreSQLのSUPERUSER特権が必要です。

    Django×Pythonのサンプルでは djangobook というユーザを利用していします。postgresqlユーザでデータベースに接続し、djangobookユーザをSUPERUSERに変更します(PATHや設定方法はOSやインストールの仕方で変わりますので、適宜読み替えてください)。

    makoto$ su - postgres
    postgres$ export PATH=$PATH:/usr/local/pgsql/bin
    postgres$ psql
    Welcome to psql 8.3.3, the PostgreSQL interactive terminal.
    ...省略
    postgres=# ALTER ROLE djangobook SUPERUSER;
    
  • Exception: Could not find PostGIS function definitions in lwpostgis.sql

    データベース作成後、PostGISが利用する関数等をデータベースに作成します。その際に必要なsqlファイルが見つからない場合にこのエラーが発生します(pg_config --sharedirでファイルがたどれない場合)。

    PostGISインストール時に利用したlwpostgis.sqlとspatial_ref_sys.sqlの位置をsettings.pyに設定します(sqlファイルのオリジナルはPostgreSQLソースコードのcontrib/postgis-x.x.xディレクトリの中にあります)。

    プロジェクト直下にpostgis_sqlというファイルを作り、その中にlwpostgis.sqlとspatial_ref_sys.sqlをコピーします。次に、settings.pyにPOSTGIS_SQL_PATHを設定します。:

    POSTGIS_SQL_PATH = os.path.join(BASE_DIR, 'postgis_sql')
    
  • function addgeometrycolumn(unknown, unknown, integer, unknown, integer) does not exist

    GeoDjangoのテンプレートを利用していない場合に発生します(Django SVN版には既に下記修正が入っていますので、settings.pyの設定のみを行いましょう)。

    Django自体のソースコードを一部改変します。

    django/contrib/gis/db/backend/postgis/creation.pyをテキストエディタで開き、_create_with_cursorという関数を探してください。

    _create_with_cursor関数のCREATE DATABASE文字列生成部分を次のように修正します(POSTGIS_TEMPLATEという設定を元にデータベース作成時のテンプレートを指定するように修正)。

    def _create_with_cursor(db_name, verbosity=1, autoclobber=False):
        "Creates database with psycopg2 cursor."
    
        # Constructing the necessary SQL to create the database (the DATABASE_USER
        #  must possess the privileges to create a database)
        create_sql = 'CREATE DATABASE %s' % connection.ops.quote_name(db_name)
    
        # use the postgis template to create the spatial db with necessary sp's
        if hasattr(settings, 'POSTGIS_TEMPLATE'):
            create_sql += ' TEMPLATE %s' % settings.POSTGIS_TEMPLATE
    
        if settings.DATABASE_USER:
            create_sql += ' OWNER %s' % settings.DATABASE_USER
        ...省略
    

    次に、settings.pyにPOSTGIS_TEMPLATEを設定します。Django×Pythonではtemplate_postgisという名前でテンプレートを作成しましたので、次のように設定します。:

    POSTGIS_TEMPLATE = 'template_postgis'
    

    ※ 上記設定をする前に一度エラーが出た後、テスト実行時にうまく既存のデータベースをクリアできないことがあります。

    It appears the database, test_manoush, already exists. Type 'yes' to delete it, or 'no' to cancel: yes
    ...省略
    psycopg2.ProgrammingError: database "test_manoush" does not exist
    

    _create_with_cursor関数でdropdbを呼び出している箇所をコメントアウトするとうまくいきます。一度正常に動作した後はdropdbを元に戻しておきましょう。

    #drop_db(db_name)
    
  • 復習

    GeoDjangoを使った場合に、テストするにはsettings.pyに次の設定がされていること。ただし、POSTGIS_SQL_PATHは不要なこともある。

    TEST_RUNNER='django.contrib.gis.tests.run_tests'
    POSTGIS_SQL_PATH = os.path.join(BASE_DIR, 'postgis_sql')
    POSTGIS_TEMPLATE = 'template_postgis'
    

return to Django×Python


 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar