2016-06-28 31 views
2

我正在製作一個Python項目,我必須從數據庫中搜索和檢索數據。
我試着做一個類,在這個類中我聲明瞭連接並執行了我的查詢,在這裏我沒有多少東西。Python MySQLdb - 連接類

import MySQLdb 
dbc =("localhost","root","1234","users") 
class sql: 
    db = MySQLdb.connect(dbc[0],dbc[1],dbc[2],dbc[3]) 
    cursor = db.cursor() 

    def query(self,sql): 
     sql.cursor.execute(sql) 
     return sql.cursor.fetchone() 

    def rows(self): 
     return sql.cursor.rowcount 

sqlI = sql() 
print(sqlI.query("SELECT `current_points` FROM `users` WHERE `nick` = 'username';")) 

所以,主要的問題是,可變dbcursor不是來自其他DEF的/功能從同一類調用。我想得到的是一個精美的查詢,我可以在這裏查詢並查看它的內容。這將總結我的代碼,因此我應該這樣做。

+1

想想這條線......'sql.cursor.execute(sql)'......哪個'sql'變量將被用來獲取光標?參數,而不是類 –

+0

你應該從你的問題中刪除不必要的標籤。它是Python 2.7或3,或與版本無關。 – RvdK

+0

@ cricket_007提供的一個,因爲它是一個函數 –

回答

5

這不是你用Python編寫類的方法。您需要在__init__方法中定義連接和光標,並通過self來引用它們。

class sql: 

    dbc = ("localhost","root","1234","users") 

    def __init__(self): 
     db = MySQLdb.connect(*self.dbc) 
     self.cursor = db.cursor() 

    def query(self,sql): 
     self.cursor.execute(sql) 
     return self.cursor.fetchone() 

    def rows(self): 
     return self.cursor.rowcount 
+0

這對我來說非常有用!謝謝,我沒有意識到我可以將它們添加到'__init__'中。 –

7

我通常使用psycopg2/Postgres的,但是這是基本的DB類,我反覆使用一遍又一遍:

class DBase: 

    dsn = ("localhost","root","1234","users") 

    def __init__(self): 
     self.conn = MySQLdb.connect(*self.dsn) 
     self.cur = self.conn.cursor() 

    def __enter__(self): 
     return self 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     if self.conn: 
      self.conn.close() 

這將讓你使用DBase類或者通常喜歡db = DBase()或在with聲明:

with DBase() as db: 
    # do stuff 

和db連接將自動關閉,當你完成它。

然後,您可以封裝您經常在方法中執行的特定查詢,並使它們易於訪問。舉例來說,如果你處理的交易記錄,你可以有一個方法,通過日期,讓他們:

def transactions_by_date(self, date): 
    sql = "SELECT * FROM transactions WHERE transaction_date = {}".format(date) 
    self.cur.execute(sql) 
    return self.cur.fetchall() 

我希望這有助於!

+0

華麗的答案!非常感謝你,我不知道'__enter__'的含義,當你返回DBase時,會發生什麼。 –

+1

'__enter__'和'__exit__'「魔術方法」讓一個類使用'with'語句。它基本上是說當它在'with DBase()as db:'context中使用時返回這個類的實例化版本。 – carusot42

+0

更多的信息在這裏:http://stackoverflow.com/questions/1984325/explaining-pythons-enter-and-exit – carusot42