7

で次のように設定された sqlite3 データベースを使用していますsettings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.spatialite',
        'NAME': 'path/to/config.sqlite',
        'TEST_NAME': 'path/to/test-config.sqlite',
        # ... USER, PASSWORD and PORT left out for brevity
    }
}

以下で開始されたテスト実行中:

python manage.py test myapp.mytest

path/to/test-config.sqliteこれにより、必要なフィクスチャをロードした別のアプリケーションで必要なデータベース ファイルが一時的に作成されます。

ただし、データベースファイルは空です。これは、あるテストで一時停止中にアサートしました。

sqlite> select * from someapp_somemodel;

... no results here :(

sqlite ファイルを必要とせず、メモリ内データベースで十分なその他のテスト ケースでは、エラーは発生しません。

私の質問:

  • とにかくそれを作成する場合、なぜdjangoはそのデータをデータベースファイルにフラッシュしないのですか? と
  • データを一時データベースファイルにダンプする必要があるため、djangoにそれを実行させるにはどうすればよいですか?

編集

興味があれば、私はDjango 1.3.1を使用しています。

EDIT2

私はフィクスチャに精通しており、それらを使用してデータベースにデータを入力していますが、私の問題は、テスト中にフィクスチャからのデータがデータベース ファイルに書き込まれないことです。その事実について十分に明確でなかったら申し訳ありません。

EDIT3

私の質問には明確な説明が必要なので、次のテスト設定を検討してください(これは私が実際に行っていることに近いものです):

class SomeTestCase(django.test.TestCase):
    fixtures = ["some_fixture.json", "some_other_fixture.json"]

    def testSomething(self):
        import pdb; pdb.set_trace()

メソッドがtestSomethingブレークポイントに達すると、プログラムを起動し、sqlite3Django によって作成された一時データベース ファイルに接続します。フィクスチャはロードされます (他のテストも同様に機能するため、私は知っています) が、データは一時データベース ファイルに書き込まれません。

4

5 に答える 5

2

おそらく、Django テストがトランザクションを使用する方法と関係があるのでしょうか?

settings.py ですべてのトランザクションをオフにしても問題が解決しないかどうかを確認します。

DISABLE_TRANSACTION_MANAGEMENT = True
于 2012-02-19T15:49:01.353 に答える
1

データベースエンジンに基づいてGeoDjangoで何かをしているよう'django.contrib.gis.db.backends.spatialite'です。GeoDjangoには追加のセットアップが必要なので、テストにも追加の何かが必要だと思います。(GeoDjangoを使用'django.db.backends.sqlite3'していない場合は、データベースエンジンとして使用してください。TEST_NAMEただし、それ以外の場合は、DjangoがテストDBをメモリに作成します。)

空間データをロードするためのプロセス全体があり、GeoDjangoのインストールドキュメントは非常に徹底的です。SpatiaLiteデータベースを作成するための直接リンクは次のとおりです。テストには基本的に同じことをする必要があります。

テストドキュメントから:

SpatiaLiteの初期化SQLスクリプトをダウンロードする必要があります。

$wget http://www.gaia-gis.it/spatialite/init_spatialite-2.3.zip

$unzip init_spatialite-2.3.zip

init_spatialite-2.3.sqlがプロジェクトのmanage.pyと同じパスにある場合、あなたがしなければならないのは次のことだけです 。$ python manage.py test

于 2012-02-20T00:25:33.603 に答える
1

ジャンゴのドキュメントから:

...SQLite データベース エンジンを使用する場合、テストはデフォルトでインメモリ データベースを使用します (つまり、データベースはメモリ内に作成され、ファイルシステムを完全にバイパスします!)。別のデータベース名を使用する場合は、TEST_NAMEの任意のデータベースのディクショナリで指定しますDATABASES

さらに、フィクスチャの読み込みについて読んだ場合:

...各テストケースの開始時、setUp()実行前に、Django はデータベースをフラッシュし、データベースを syncdb が呼び出された直後の状態に戻します...

いくつかのフィクスチャがロードされた新しいデータベースが必要な場合は、もちろん、runningsyncdbで空のデータベースを作成し、いくつかのフィクスチャをdjango-admin.py loaddata!でロードすることで実現できます。

于 2012-02-19T21:53:56.367 に答える
1

私は方法を見つけましたが、(-F または -W 0/1 を使用して) hdparm をいじったので、それがうまくいくかどうかはわかりません。私は再起動し、考えを確認するために再試行しました。また、このテストにはSpatiaLiteがありませんが、あなたが言ったように、これはおそらく無関係です.

とにかく、これを再現するには 2 つの画面が必要です。screen0 はテストを実行し、screen1は動作する sh シェルであり、 screen0 のプロセスが一時停止されます。

テストを開始します(screen0):

>>> ./manage.py test testapp
Creating test database for alias 'default'...
Destroying old test database 'default'...
Type 'yes' if you would like to try deleting the test database 'db_test.sqlite', or 'no' to cancel: yes
--Return--
None
> /home/jpic/testproject/testapp/tests.py(16)testSomething()
     14 
     15     def testSomething(self):
---> 16         import ipdb; ipdb.set_trace()

作成されたテスト データベース ファイルのサイズを確認します(screen1):

<<< 18:00.39 Mon Feb 20 2012!~/testproject 
<<< jpic@germaine!10004 env
>>> ls -l db_test.sqlite
-rw-r--r-- 1 jpic jpic 49152 2012-02-20 18:00 db_test.sqlite

Python (screen0)から PRAGMA SYNCHRONOUS sql コマンドを実行します。

ipdb> from django.db import connection; cursor = connection.cursor()
ipdb> cursor.execute("PRAGMA SYNCHRONOUS")
<django.db.backends.sqlite3.base.SQLiteCursorWrapper object at 0x294f348>
ipdb> 

データベース ファイルのサイズが増加したかどうかを確認します(screen1):

<<< 18:00.42 Mon Feb 20 2012!~/testproject 
<<< jpic@germaine!10005 env
>>> ls -l db_test.sqlite
-rw-r--r-- 1 jpic jpic 272384 2012-02-20 18:00 db_test.sqlite

ファイルにデータが書き込まれました。

PRAGMA SYNCHRONOUSどうやら単独で値を照会する必要があるため(私の場合: 2/FULL)、あまり意味がありません。しかし実際には、ディスクに書き込みます。2 (FULL) がない場合は、 2: に設定する必要があることに注意してくださいPRAGMA SYNCHRONOUS 2

今、が書かれたかはわかりません (完全に書かれたのでしょうか?) テスト データベースを手に入れることができないためです: テスト データベースsqlite db_test.sqliteでクライアントを取得するために screen1 で実行すると「SQLエラー:データベースがロックされています」ため、コマンド(selectでも.dumpでもありません)。でも、それが今のあなたの問題だと思います B)

于 2012-02-20T17:05:26.940 に答える
1

最初の syncdb を実行してデータベース テーブルを作成しましたか? ( python yourproject/manage.py syncdb )

settings.py で、INSTALLED_APPS の下にどのアプリをインストールしましたか?

あなたのプロジェクトでは、どのモデルを構築しましたか?

INSTALLED_APPS にインストールしたアプリと、プロジェクトに追加したカスタム モデルに応じて、syncdb が作成するデータベースが決まります。

于 2012-02-19T13:49:51.607 に答える