2011-06-10 25 views
4

從Python(使用Python 2.6)連接到SQLite數據庫時,有什麼策略可以確保程序打開了一個有效的數據庫文件(這裏的有效意思是「匹配程序期望的內容」)?檢查數據庫文件是否有效以及程序期望的內容?

我想確保經過一些開放性檢查後,我可以(合理地)確定該程序已經打開了一個數據庫文件,該文件將按預期工作 - 理想情況下,如果該文件是新/空的並且停止,則爲一切CREATE /警告如果該文件是其他數據庫,或以其他方式損壞。

我猜訣竅是將打開的文件的模式與程序中的預期模式進行比較?
如果是這樣,你會怎麼做?
否則,還應該做些什麼?

回答

3

在解決方案,我想類似的東西,我傾向於保持一個.sql文件位於同一目錄中我的代碼,包含數據庫的構建指令,使用類似於下面的結構:

# setup 
PRAGMA foreign_keys=ON; 
PRAGMA journal_mode=TRUNCATE; 
PRAGMA locking_mode=EXCLUSIVE; 
PRAGMA synchronous=NORMAL; 

# Locations 
CREATE TABLE IF NOT EXISTS Locations (
    locID INTEGER PRIMARY KEY, 
    locPath TEXT NOT NULL 
); 
# blah-blah 
CREATE UNIQUE INDEX IF NOT EXISTS fldPath_idx 
ON Folders(fldPath); 
# and so on 

只是注意不要讓所有的SQL語句用分號作爲行的最後一個非空白字符結束,因爲我有一個像下面的方法,以確保每一個運行我的應用程序啓動時的架構代碼:

def db_schema(self): 
    cur= self._db.cursor() 
    with io.open(self.SQLPATH, "r") as fp: 
     sql_statement= "" 
     for line in fp: 
      line= line.rstrip() 
      if line.startswith('#'): continue 
      sql_statement+= line 
      if line.endswith(";"): 
       try: 
        cur.execute(sql_statement) 
       except sql.OperationalError: 
        print("Failed:\n%s" % sql_statement) 
       sql_statement= "" 
    # file is done 
    cur.close() 

請注意使用CREATE TABLE IF NOT EXISTSCREATE INDEX IF NOT EXISTS

+1

這看起來很直觀,看起來像它將適用於新的/空的或有效的文件。但是,如果連接了「錯誤」文件,那麼可能會將不需要的表添加到其他數據庫文件,是的?我想這不是一個可能的或主要的問題,但我只是想知道是否有一種很好的方法來檢測這種情況呢? – DMA57361 2011-06-10 11:42:10

+1

是的,它有冒險添加不需要的表到另一個數據庫。你總是可以從數據庫獲得[現有表的列表](http://www.sqlite.org/faq.html#q7),如果不是空的,它不同意它們應該是什麼,你可以避免運行架構創建代碼。 – tzot 2011-06-10 13:07:07

3

SQLite有一個pragma user_version,它將爲您存儲數據庫中的任意數字。通常情況下,您可以使用它來跟蹤您自己的模式版本 - 例如,第一版本的應用程序爲1,並且稍後更改模式三應用程序版本時,將其設置爲2以檢測代碼已完成模式升級。

但是,您可以將其設置爲任何起始值。例如從3656672354開始,並添加到您的內部版本跟蹤。任何其他數據庫的值在該範圍內的可能性幾乎爲零。

相關問題