2014-06-07 36 views
3

爲什麼Django允許您重置postgres和其他DBMS的序列(AutoID)字段,但不是SQLite3?爲什麼Django在SQLite3中不重置序列?

看在django/db/backends/sqlite3/base.pysql_flush方法的源代碼,有一個評論,說:

注:自動遞增的指數復位無要求(參見其他sql_flush()實現)。只需返回SQL在這一點

我有幾個測試,我加載夾具文件,取決於絕對主鍵ID。由於Django不重置SQLite的自動ID字段,因此這些設備無法正確加載。

看來,它是有點微不足道在sqlite的自動ID列復位:How can I reset a autoincrement sequence number in sqlite

+0

聽起來像是你的測試被打破,然後。沒有什麼應該取決於絕對ID。 –

+0

@DanielRoseman是的,大家都知道這不是最佳做法。事實上,在測試中很容易質疑加載裝置的使用。這就是爲什麼像FactoryGirl這樣的東西存在。但是,在這種情況下,這是一個完美的解決方案。 Django文檔指定在測試用例中使用重置序列https://docs.djangoproject.com/en/1.5/topics/testing/overview/#django.test.TransactionTestCase.reset_sequences。即使他們提到這是一個壞主意。然而,我的問題是:即使這是一個壞主意,爲什麼他們不支持sqlite? –

+0

我不知道sqlite支持序列重寫的方式與Oracle所說的相同。例如,我發現當我清空相關表時,sqlite Auto Integer主鍵會重置。我知道在Oracle下,Auto ID序列作爲一個完全獨立的實體存在,可以獨立重置。 –

回答

0

也許這個片段將幫助:

import os 

from django.core.management import call_command 
from django.db import connection 
from django.utils.six import StringIO 


def reset_sequences(app_name): 
    os.environ['DJANGO_COLORS'] = 'nocolor' 
    buf = StringIO() 
    call_command('sqlsequencereset', app_name, stdout=buf) 
    buf.seek(0) 

    sql = "".join(buf.readlines()) 

    with connection.cursor() as cursor: 
     cursor.execute(sql) 

    print("Sequences for app '{}' reset".format(app_name)) 
相關問題