簡體   English   中英

Django測試:臨時數據庫文件中沒有數據

[英]Django Testing: no data in temporary database file

我在settings.py使用如下settings.py的sqlite3數據庫:

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

我熟悉fixtures,我使用它們來填充數據庫,但我的問題是在測試期間來自fixtures的數據沒有寫入數據庫文件。 對不起,如果我對這個事實不夠清楚。

EDIT3

由於我的問題需要澄清,請考慮以下測試設置(這與我實際做的很接近):

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

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

testSomething方法運行到斷點時,我啟動sqlite3程序並連接到Django創建的臨時數據庫文件。 加載了固定裝置(我知道,因為其他測試也可以工作),但數據不會寫入臨時數據庫文件。

您是否運行了初始syncdb來創建數據庫表? python yourproject / manage.py syncdb

在您的settings.py中,您在INSTALLED_APPS下安裝了哪些應用程序?

在您的項目中,您構建了哪些模型?

根據您在INSTALLED_APPS中安裝的應用程序以及已添加到項目中的自定義模型,將決定syncdb將創建的數據庫。

也許它與Django測試如何使用交易有關

如果關閉 settings.py中的所有事務 ,請檢查問題是否仍然存在:

DISABLE_TRANSACTION_MANAGEMENT = True

django文檔

...當使用SQLite數據庫引擎時,測試將默認使用內存數據庫(即數據庫將在內存中創建,完全繞過文件系統!)。 如果要使用其他數據庫名稱,請在字典中為DATABASES任何給定數據庫指定TEST_NAME

此外,如果您閱讀夾具裝載

...在每個測試用例的開始,在運行setUp()之前,Django將刷新數據庫,在調用syncdb后將數據庫返回到它所處的狀態...

如果您需要一個裝有一些燈具的新數據庫,您當然可以通過創建一個運行syncdb的空數據庫並使用django-admin.py loaddata加載一些燈具來django-admin.py loaddata

看起來你正在使用GeoDjango基於你的數據庫引擎'django.contrib.gis.db.backends.spatialite'做些什么。 GeoDjango需要額外的設置,所以我的猜測是它還需要一些額外的測試。 (如果你沒有使用GeoDjango,只需使用'django.db.backends.sqlite3'作為你的數據庫引擎。保留TEST_NAME否則Django會在內存中創建測試數據庫。)

加載空間數據有一個完整的過程,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

我找到了一種方法,但由於我也與hdparm(使用-F或-W 0/1)混淆,我不知道它是否適合你。 我重新啟動並重新嘗試確保思考。 此外,本次測試並沒有 SpatiaLite但正如你說,這可能是無關緊要的。

無論如何,我們需要2個屏幕來重現這一點, screen0運行測試screen1是一個sh shell ,用於將屏幕0的進程暫停。

開始測試 (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中運行sqlite db_test.sqlite db_test.sqlite來獲取測試數據庫上的客戶端:我可以不運行任何命令(也不是select,也不是.dump),因為“SQL錯誤:數據庫被鎖定”。 但是,我想現在這是你的問題B)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM