2012-02-08 31 views
1

Noobish問題可以確定。我試圖將一些通用代碼移動到單獨的模塊中,並將代碼作爲導入的函數使用。代碼通過MySQLdb進行MySQL查詢。當函數是主腳本的一部分時,它運行得很好。當我從一個單獨的模塊中導入函數時,函數失敗,因爲遊標對象不再被定義。有沒有一種方法可以導入函數,而無需爲導入的函數定義單獨的遊標對象?如何在導入的函數上使用MySQLdb連接對象

這裏是一個編碼的例子。這工作:

import MySQLdb 
#from mod2 import lookup_value 

def get_db_connection(database_name): 
    db = MySQLdb.connect('localhost', 'user', 'pswrd', database_name) 
    cur = db.cursor() 
    return db, cur 

def lookup_value(user_name): 
    query = "SELECT COUNT(*) FROM x_user_%s" % (user_name) 
    cur.execute("%s" % (query)) 
    return cur.fetchone() 

db_name = 'mg_test' # database name 
user_name = 'test' # name of a specific table in the database 

db, cur = get_db_connection(db_name) 
value = lookup_value(user_name) 

當我移動代碼Lookup_Array中的第二個文件,並導入它(「從量mod2進口Lookup_Array中」),該代碼,因爲遊標對象是不確定的失敗。導入的lookup_value版本只在我創建一個遊標對象時才起作用。這看起來效率很低。處理這個問題的最好方法是什麼?

回答

3

這是因爲lookup_value在您導入的文件中搜索cur。您可以將其全部放入課程中。

class DB(): 
    def __init__(self,database_name): 
     db = MySQLdb.connect('localhost', 'user', 'pswrd', database_name) 
     self.cur = db.cursor() 


    def lookup_value(self,user_name): 
     query = "SELECT COUNT(*) FROM x_user_%s" 
     self.cur.execute(query, (user_name,)) 
     self.result = self.cur.fetchone() 
     return self.result 

現在你可以做

.... 
db = DB(db_name) 
value = db.lookup_value(user_name) 

當您導入DB from mod2 import DB最後一部分應該仍然工作。

還拿我如何執行在lookup_value查詢這確保了數據消毒

+0

當我一起做過黑客的代碼爲我的項目來說,我期待着真正的學習蟒蛇。我不太確定我轉發了,但我希望重寫它,但是:)謝謝 – Cole 2012-02-08 17:57:25

1

如果你希望它們是獨立的,你應該將一個遊標變量傳遞給你的函數。 在任何情況下,您都應該在函數中使用僅作爲參數傳遞的局部變量和變量。

相關問題