Con*_*ius 7 python sqlite django django-testing django-database
我使用的 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
}
}
Run Code Online (Sandbox Code Playgroud)
在测试运行期间开始于:
python manage.py test myapp.mytest
Run Code Online (Sandbox Code Playgroud)
这会临时创建一个数据库文件path/to/test-config.sqlite,我需要在另一个加载了所需装置的应用程序中使用该文件。
然而,数据库文件是空的,我在一个测试的暂停期间断言:
sqlite> select * from someapp_somemodel;
... no results here :(
Run Code Online (Sandbox Code Playgroud)
其他不需要sqlite文件并且内存数据库就足够的测试用例,不会发生错误。
我的问题:
编辑
如果有任何兴趣,我正在使用 Django 1.3.1。
编辑2
我熟悉fixtures,我用它们来填充数据库,但我的问题是fixtures 中的数据在测试过程中没有写入数据库文件。对不起,如果我对这个事实不够清楚。
编辑3
由于我的问题需要一些澄清,请考虑以下测试设置(与我实际做的很接近):
class SomeTestCase(django.test.TestCase):
fixtures = ["some_fixture.json", "some_other_fixture.json"]
def testSomething(self):
import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
当testSomething方法运行到断点时,我启动sqlite3程序并连接到 Django 创建的临时数据库文件。夹具已加载(我知道,因为其他测试也可以),但数据未写入临时数据库文件。
我找到了一种方法,但由于我也搞乱了 hdparm (使用 -F 或 -W 0/1),我不知道它是否适合你。我确实重新启动并重新尝试以确保想法。另外,此测试没有SpatiaLite,但正如您所说,这可能无关紧要。
无论如何,我们需要 2 个屏幕来重现此情况,screen0 运行测试,screen1 是一个 sh shell,用于处理 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()
Run Code Online (Sandbox Code Playgroud)
检查创建的测试数据库文件的大小(屏幕1):
<<< 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
Run Code Online (Sandbox Code Playgroud)
从 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>
Run Code Online (Sandbox Code Playgroud)
检查数据库文件的大小是否增加(屏幕1):
<<< 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
Run Code Online (Sandbox Code Playgroud)
数据已写入文件。
这对我来说没有多大意义,因为显然应该PRAGMA SYNCHRONOUS单独查询该值(在我的例子中:2/FULL)。但在实践中,它会写入磁盘。请注意,如果您没有 2 (FULL) 那么您应该将其设置为 2: PRAGMA SYNCHRONOUS 2。
现在,我不能说写了什么(是否已完全编写?),因为我无法获得测试数据库:如果我sqlite db_test.sqlite在 screen1 中运行以在测试数据库上获取客户端:我无法运行任何命令(也不是 select,也不是 .dump),因为“SQL 错误:数据库已锁定”。但是,我想这就是你现在的问题 B)
| 归档时间: |
|
| 查看次数: |
3233 次 |
| 最近记录: |