2015-10-15 53 views
1

我將BaseX添加到現有的Web應用程序中,並且正在編寫代碼以將數據導入到該應用程序中。 documentation是清晰的,如何防止意外覆蓋已經存在的數據庫?

現有的數據庫將被覆蓋。

尋找這種行爲mindboggingly危險,我試圖與希望文檔是錯誤的,但不幸的是我的測試證實了它。例如,使用basexclient我可以這樣做:

> create db test 
Database 'test' created in 12.03 ms. 
> create db test 
Database 'test' created in 32.43 ms. 
> 

我也可以複製這種行爲與Python client,這是我什麼,我實際使用我的應用程序。減少我的代碼來的要點:

session = BaseXClient.Session("127.0.0.1", 1984, "admin", "admin") 
session.create("test", "") 

不要緊test是否存在,如果存在的話,整個事情被覆蓋。

我該如何解決這個危險的默認行爲?我想避免在生產中出現失誤的可能性。

回答

1

在創建數據庫之前,您可以發出list command。例如使用命令行客戶端,如果數據庫不存在:

> list foo 
Database 'foo' was not found. 

而如果數據庫存在:

> list test 
Input Path Type Content-Type Size 
------------------------------------ 

這是空的,所以它不顯示任何內容,但在數據庫至少你沒有收到錯誤信息。當你使用客戶端時,你必須檢查是否出錯。使用Python客戶端,你可以這樣做:

def exists(session, db): 
    try: 
     session.execute("list " + db) 
    except IOError as ex: 
     if ex.message == "Database '{0}' was not found.".format(db): 
      return False 
     raise 
    return True 

客戶提出IOError如果服務器引發錯誤,這是報告的一個問題一個非常通用的方式。所以你必須測試錯誤信息來弄清楚發生了什麼。我們重新評估錯誤信息是否與我們的測試相關。這樣我們就不會吞噬由無關問題引起的異常。

與該功能你可以這樣做:

session = BaseXClient.Session("127.0.0.1", 1984, "admin", "admin") 
if exists(session, "test"): 
    raise SomeRelevantException("Oi! You are about to overwrite your database!") 
session.create("test", "")