2016-06-28 81 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