2017-02-15 53 views
1

我有一個django項目,當我打電話給py.test時運行測試,但我最近注意到它沒有檢查外鍵約束。我怎樣才能檢查外鍵約束?我如何使用sqllite啓用pytest中的外鍵檢查

顯然,foreign key constraints weren't even possible until sqlite 3,但我真的不知道我運行的是什麼版本,因爲我沒有用於sqlite的cli,但它只是被django自動包含在內? (我使用的是django 1.9.10),但是sqlite 3在2009年推出,所以這不是問題嗎?

也許it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command.,但我不知道如何讓我的測試做到這一點?

[UPDATE] 因此,它看起來像是開箱即用的sqlite沒有檢查它們。

class Referenced(models.Model): 
    pass 

class Referencer(models.Model): 
    fk = models.ForeignKey(Referenced) 

>>> Referencer.objects.create(fk_id=-1) 
<Referencer> 
>>> Referencer.objects.all()[0].fk 
DoesNotExist 

回答

0

我最終創建了一個包來解決這個問題。

pip install sqlite_checkforeignkeys 

然後配置數據庫:

DATABASES = { 
    'default': { 
     'ENGINE': 'sqlite_checkforeignkeys_engine', 
     'TEST': {'NAME': ':memory:'}, 
    } 
} 

它涉及到重寫現有的SQLite引擎執行外鍵

0

的Python附帶sqlite3的。您可以通過

import sqlite3 
sqlite3.sqlite3.sqlite_version 

檢查版本作爲設定PRAGMA聲明,可能取決於所使用的驅動程序,以及是否需要在使用的ORM。

隨着peewee,你很多使用

db = SqliteDatabase('my_app.db', pragmas=(('foreign_keys', 'on')))