2011-04-10 2 views
0

de l'interpréteur je peux très bien sortir >>> depuis MySQLdb. Donc, je suppose que le module a effectivement été chargé. Ma source se présente comme suit:python2.6 avec MySQLdb, NameError 'MySQLdb' non défini

from Tkinter import *
from MySQLdb import *
"""
Inventory control for Affordable Towing

Functions:
connection() - Controls database connection
delete() - Remove item from database
edit() - Edit item's attributes in database
lookup() - Lookup an item
new() - Add a new item to database
receive() - Increase quantity of item in database
remove() - Decrease quantity of item in database
report() - Display inventory activity
transfer() - Remove item from one location, receive item in another

"""
def control():
....dbInfo = { 'username':'livetaor_atowtw', 'password':'spam', \
....'server':'eggs.com', 'base':'livetaor_towing', 'table':'inventory' }
....def testConnection():
........sql = MySQLdb.connect(user=dbInfo[username], passwd=dbInfo[password], \
........host=dbInfo[server], db=dbInfo[base])
........MySQLdb.mysql_info(sql)

....testConnection()

control()

cela me donne:

[email protected]:~/python/towing/inventory$ python inventory.py
Traceback (most recent call last):
..File "inventory.py", line 53, in
....control()
..File "inventory.py", line 26, in control
....testConnection()
..File "inventory.py", line 22, in testConnection
....sql = MySQLdb.connect(user=dbInfo[username], passwd=dbInfo[password], \
NameError: global name 'MySQLdb' is not defined

1) où vais-je tort?
2) d'autres pièges que vous voyez?
3) des conseils sur la façon de vérifier une connexion valide à la base de données (pas seulement le serveur)?

Répondre

2

Cela est dû à la manière dont vous importez le module, puis à son référencement.

Change:

from MySQLdb import * 

à

import MySQLdb 

si vous prévoyez de référençant la mode que vous êtes.

Quoi qu'il en soit, voici comment ces déclarations et les fonctions de travail:

De: http://effbot.org/zone/import-confusion.htm

import X importe le module X et crée une référence à ce module dans l'espace de noms en cours. En d'autres termes, après avoir exécuté cette instruction, vous pouvez utiliser X.name pour désigner les éléments définis dans le module X.

depuis X import * importe le module X et crée des références dans l'espace de noms actuel pour tous objets publics définis par ce module (c'est-à-dire, tout ce qui n'a pas de nom commençant par "_"). En d'autres termes, après avoir exécuté cette instruction, vous pouvez simplement utiliser un nom simple pour désigner les éléments définis dans le module X. Mais X lui-même n'est pas défini, donc X.name ne fonctionne pas. Et si le nom était déjà défini, il est remplacé par la nouvelle version. Et si le nom dans X est modifié pour pointer vers un autre objet, votre module ne le remarquera pas. À partir de X import a, b, c importe le module X et crée des références dans l'espace de nom actuel aux objets donnés. Ou en d'autres termes, vous pouvez maintenant utiliser a et b et c dans votre programme.

+0

ma semaine, l'esprit faible a oublié l'importation, et la façon dont elle affecte l'espace de noms. Merci de me rappeler combien je suis un idiot. Vos explications étaient bien au-dessus de la moyenne! J'essaierai * de ne plus oublier cette leçon. – brad

1

from MySQLdb import * et import MySQLdb faire très différentes choses.