2016-06-28 6 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は、同じクラスの他のデフの/機能から呼び出し可能ではないということです。私が得たいのは、洗練されたクエリです。ここでクエリを作成し、そのコンテンツを取得できます。これは私のコードを要約するので、私はすべきです。

+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() 

これはあなたがいずれかの通常db = DBase()よう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__' "magic methods"は、クラスに 'with'ステートメントを使用させます。基本的に、このクラスのインスタンス化されたバージョンを、DBase()としてdb: 'コンテキストで使用するときに返すと言っています。 – carusot42

+0

さらに詳しい情報はこちら:http://stackoverflow.com/questions/1984325/explaining-pythons-enter-and-exit – carusot42

関連する問題