2016-10-12 1 views
0

J'essaye de construire une classe en utilisant Python afin de gérer toutes les interactions avec les bases de données MySQL. J'ai installé le module MySQLdb et testé la connexion aux bases de données en utilisant un simple code. Quand je lance le code suivant:La classe Python pour prendre soin de la connexion MySQL continue de lancer une erreur

import MySQLdb 

db = MySQLdb.connect (host="localhost", user="root" , passwd="xxxxxxx" , db= "some_db") 
cursor = db.cursor() 
s = cursor.execute ("SELECT * FROM some_table") 
#Retrive a record to test it all went well... 
t = cursor.fetchall() 
for x in t: 
print x 
db.commit() 
db.close() 

Le code ci-dessus a bien fonctionné, il relié à la base de données « some_db » récupéré le seul enregistrement de la table « some_table ».

Toutefois, lorsque j'exécute le code répertorié ci-dessous, qui consiste en une section d'une classe utilisant la même logique, une erreur est générée. L'idée derrière la classe est d'ouvrir n'importe quelle base de données et autant de connexions que l'on souhaite ouvrir, effectuer des requêtes, etc. S'il vous plaît gardez à l'esprit que ce qui suit est juste une section de classe, plus de fonctions et quoi-avez-vous-être ajouté.

Le code est le suivant:

import MySQLdb 

class d_con (object): 
    def __init__ (self, host, user , passwd , db): 
     self.host = host 
     self.user = user 
     self.passwd = passwd 
     self.db = db 
     self.d_b = MySQLdb.connect(host = self.host , user = self.user , passwd = self.passwd , db = self.db) 
     #Test the connection... 
     self.cur = self.d_b.cursor() 
     self.disp = self.cur.execute ("SELECT VERSION()") 
     print self.disp 

    def close_connection(self): 
     print "...Initializing connection closure..." 
     self.d_b.close() 

    #More function will be added , I am just testing the constructor. 

if __name__ == "__main__ " : 
    a = d_con() 

else: 
    print (" d_con class is imported , please instantiate an object in the fashion a = datacon.d_con() . ") 

Quand j'importer le fichier contenant le code ci-dessus, il exécute et imprime la déclaration demandant à instancier la classe. Après avoir instancier la classe

a=datacon.d_con("localhost" , "root" , "xxxxxxx" , "some_db") 

cette erreur se fait jeter:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "datacon.py", line 8, in __init__ 
    self.d_b = MySQLdb.connect(self.host , self.user , self.passwd , self.db) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect 
    return Connection(*args, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site- packages/MySQLdb/connections.py", line 193, in __init__ 
    super(Connection, self).__init__(*args, **kwargs2) 
_mysql_exceptions.OperationalError: (1049, "Unknown database 'some_table'") 

Soyez assurés que j'ai, à plusieurs reprises, vérifié que les paramètres du MySQLdb.connect() sont corrects. De plus, j'ai même câblé les paramètres dans le constructeur pour m'assurer qu'il n'y a pas de fautes de frappe lors de l'instanciation de la classe. À chaque fois, j'ai la même erreur.

Depuis que je suis nouveau à Python, je ne suis pas sûr si le fichier de classe a du mal à importer le module MySQLdb ou s'il y a un problème de portée variable. Le module MySQLdb a été importé avec succès lorsque j'ai exécuté le code au début de cette conversation en utilisant la même base de données et les mêmes informations d'identification MySQL! Pourriez-vous m'aider? Merci d'avance.

Ps: Je courais tout cela sur Mac Os 10,12

+0

'a = datacon.d_con (" localhoast "' - est-ce juste une faute de frappe ici ou est-ce aussi dans votre fichier? – asongtoruin

+0

voulez-vous dire 'localhost' avec' localhoast'? –

+0

Merci d'avoir souligné que Michel Toouw et asongtorium, cette faute de frappe est juste sur cette même page, sur le fichier réel et quand je cours, j'ai toujours la même erreur jeté même avec l'orthographe correcte de locahost et le reste des informations d'identification .. Je l'ai rectifié! – Tequillo

Répondre

0

est pas votre paramètre MySQLdb.connect syntaxe différente dans vos exemples? Dans le travail, vous utilisez des paramètres nommés pour connect (host = "localhost") etc. mais dans le modèle de classe, vous omettez les noms de paramètres host =, user = etc et les paramètres basés sur la localisation ne semblent pas fonctionner.

Hannu

+0

l'a changé, donc cette section du code dans la classe ressemble à ceci: – Tequillo

+0

self.d_b = MySQLdb.connect (hôte = self.host, utilisateur = self.user, passwd = self.passwd, db = self.db) – Tequillo

+0

J'ai toujours la même erreur – Tequillo

0

Désolé les gars! Le code est correct, j'ai systématiquement entré le nom d'une table au lieu d'une base de données dans la variable self.db. Le code fonctionne correctement.