2013-09-23 83 views
0

我想對使用MySQL數據庫的代碼運行一些測試。現在,代碼由多個模塊組成,這些模塊全部導入公共模塊mainlib。這個模塊沒有MySQLdb Python - 測試數據庫

db = MySQLdb.connect(host='localhost', user='admin', password='admin', db='MyDatabase'). 

我想用測試數據庫而不是真正的數據庫做測試。

我想我可以關閉連接(mainlib.db.close()),並創建的測試腳本一個新的連接:

db = MySQLdb.connect(host='localhost', user='admin', password='admin', db='TestDatabase') 

,並命名用相同的全局變量新的光標。但我不確定其他模塊中的進口是如何工作的。在任何情況下,這種方法似乎並沒有工作,因爲我得到了InterfaceError: (0, '')以及從我的測試數據庫cursor沒有數據返回。

有誰知道如何切換到一個測試數據庫,而無需修改源代碼?

+0

@Steve,謝謝;那工作。如果你把它作爲答案,我會選擇它。另外,如果您對如何將mainlib重新配置爲更漂亮的解決方案有任何想法,請告訴我! – newt

回答

1

Python的 「全局」 變量不具有全局範圍。它們是模塊範圍變量。因此,不同模塊中同名的全局變量不是同一個變量。

我想你可能會關閉mainlib.db,然後將mytestcode.db設置爲一個新的數據庫。所有其他代碼當然會繼續使用mainlib.db,現在已關閉。

嘗試mainlib.db = MySQLdb.connect(...),與同爲光標。直接修改另一個模塊的變量是很醜陋的,但它可以像你期望的那樣工作。

另一種方法是引入配置如何mainlib打開數據庫的方式。例如,你可以有這樣的功能在mainlib:現在

db = None 
dbname = None 
cursor = None 

def connectdb(name = None): 
    """ 
    Set up the global database connection and cursor, if it isn't already. 

    Omit 'name' when the caller doesn't care what database is used, 
    and is happy to accept whatever database is already connected or 
    connect to a default database. 

    Since there cannot be multiple global databases, an exception is thrown 
    if 'name' is specified, the global connection already exists, and the 
    names don't match. 
    """ 
    global db, dbname, cursor 
    if db is None: 
     if name is None: 
      name = 'MyDatabase' 
     db = MySQLdb.connect(host='localhost', user='admin', password='admin', db=name) 
     dbname = name 
     cursor = db.cursor() 
    elif name not in (None, dbname): 
     raise Exception('cannot connect to the specified db: the global connection already exists and connects to a different db') 

,在正常的程序(不是每一個模塊,只是頂層的),你導入mainlib後立即打電話mainlib.connectdb()。在您的測試代碼中,您可以撥打mainlib.connectdb('TestDatabase')

或者,你可以有connectdb返回光標和/或連接對象,這樣一來,一切使用全局數據庫可以通過這個功能。

就個人而言,我不喜歡使用這個在所有的全局 - 我想有一個函數來創建一個數據庫連接,我會通過該數據庫作爲參數到任何需要它。但是,我知道這方面的口味各不相同。

0

速戰速決是使用相同的光標,而是選擇表時要明確與數據庫。例如,如果你在兩個數據庫中都有一個表T,

你可以做

select * from myDatabase.T #if you want to use the real table 

select * from TestDatabase.T #if you want to use the test table 
+0

我可以在我的測試腳本中做到這一點,但其餘的模塊(我在測試腳本中調用的)將繼續使用真實的數據庫。 – newt