python – Django测试:临时数据库文件中没有数据

我在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

这暂时创建了一个数据库文件路径/到/ 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创建的临时数据库文件.加载了固定装置(我知道,因为其他测试也可以工作),但数据不会写入临时数据库文件.

最佳答案
我找到了一种方法,但由于我也与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 should just query for the value(在我的情况下:2 / FULL).但在实践中,它写入磁盘.请注意,如果您没有2(FULL),则应将其设置为2:PRAGMA SYNCHRONOUS 2.

现在,我不能说写了什么(是完全写的吗?)因为我无法掌握测试数据库:如果我在screen1中运行sqlite db_test.sqlite来获取测试数据库上的客户端:我可以不运行任何命令(也不是select,也不是.dump),因为“SQL错误:数据库被锁定”.但是,我想现在这是你的问题B)

转载注明原文:python – Django测试:临时数据库文件中没有数据 - 代码日志