2016-06-06 1 views
1

Ich versuche, eine Klasse zu erstellen, die alle meine Datenbankoperationen enthält. Ich möchte eine MySQL-Verbindung immer dann initiieren, wenn diese Klasse aufgerufen wird, alle db-Vorgänge ausführen, die sie ausführen muss, und sie nach Abschluss der Klasse schließen.Python, wie man eine MySQL-Verbindung innerhalb einer Klasse initiiert und schließt

Das ist, was ich bisher habe:

import MySQLdb 

class Database_Test(object): 
    def __init__(self, db_local): 
     self.db_conn = MySQLdb.connect(**db_local) 
     self.db_cursor = self.db_conn.cursor() 

    def get_row(self, sql, data = None): 
     self.db_cursor.execute(sql) 
     self.resultset = self.db_cursor.fetchall() 
     self.db_cursor.close() 
     return self.resultset 

    # Close db connection something like this? 
    # db_conn.close() 

db_config = { 
      'host':"127.0.0.1",     # database host 
      'port': 3306,      # port 
      'user':"root",      # username 
      'passwd':"admin",     # password 
      'db':"test",      # database 
      'charset':'utf8'     # charset encoding 
      } 

sql = "SELECT * FROM mytest LIMIT 10" 

test = Database_Test(db_config) 
test.get_row(sql) 
print(test) 

Dies ist, was ich bekommen:

<__main__.Database_Test object at 0x00774BF0> 

diese Irgendwie ist nicht das, was ich erwartet hatte einige Datensätze zu erhalten, wie ich es erwartet hatte zu bekommen aus der Datenbank.

+0

Vergessen Sie nicht, dass die Einrichtung einer Verbindung erheblich mehr Erfahrung sein kann nsive als einen vorhandenen zu verwenden. Die meisten Datenbanksysteme empfehlen, einen Pool aktiver Verbindungen zu verwenden, bei denen Sie eine Verbindung aus einem Pool erhalten, sie verwenden und sie nach Abschluss des Pools wieder in den Pool freigeben. – tadman

Antwort

2

Was sehen Sie gedruckt ist die test Objekt String-Darstellung, sondern soll Sie erhalten und das Ergebnis get_row() Methodenaufruf:

test = Database_Test(db_config) 
resultset = test.get_row(sql) 
print(resultset) 
+0

Das war wirklich noob von mir. Ich wusste nicht, dass ich die String-Darstellung druckte. Wie auch immer, wie kann ich die Verbindung innerhalb der Klasse nach Gebrauch schließen? – Cryssie

0

@Alecxe Antwort über Ihre Ausführung der Anweisung war, falls von Ihnen Frage über das Öffnen und Schließen einer Verbindung, können Sie Context Managers magische Methoden verwenden:

import MySQLdb 

class Database_Test(object): 
    def __init__(self, db_local): 
     self.db_local = db_local 
     self.db_conn = None 
     self.db_cursor = None 

    def __enter__(self): 
     # This ensure, whenever an object is created using "with" 
     # this magic method is called, where you can create the connection. 
     self.db_conn = MySQLdb.connect(**self.db_local) 
     self.db_cursor = self.db_conn.cursor() 

    def __exit__(self, exception_type, exception_val, trace): 
     # once the with block is over, the __exit__ method would be called 
     # with that, you close the connnection 
     try: 
      self.db_cursor.close() 
      self.db_conn.close() 
     except AttributeError: # isn't closable 
      print 'Not closable.' 
      return True # exception handled successfully 

    def get_row(self, sql, data = None): 
     self.db_cursor.execute(sql) 
     self.resultset = self.db_cursor.fetchall() 
     return self.resultset 

db_config = { 
      'host':"127.0.0.1",     # database host 
      'port': 3306,      # port 
      'user':"root",      # username 
      'passwd':"admin",     # password 
      'db':"test",      # database 
      'charset':'utf8'     # charset encoding 
      } 


sql = "SELECT * FROM mytest LIMIT 10" 

with Database_Test(db_config) as test: 
    resultSet = test.get_row(sql) 
    print(resultSet) 
+0

Sie müssen 'self.db_cursor_close()' aus 'get_row()' entfernen – Nicarus

+0

@Nicarus ja, notiert. :) –

Verwandte Themen