En gros, lorsque ma commande SQL obtient des données pour la base de données, elle sort comme ceci [('admin',)]
pour x dans mon résultat: imprimer (x [0]) J'ai découvert que cela l'imprimera en tant qu'administrateur, c'est comme ça que je le veux, mais j'ai besoin d'un enregistrement dans une variable telle que le nom d'utilisateur
def login (): mydb = mysql.connector.connect (
host="localhost", user="root", passwd="password", database="testdb", ) username=input("Please Enter Your username: ") mycursor = mydb.cursor() mycursor.execute ("SELECT name FROM account_database WHERE name = 'admin' ") myresult = mycursor.fetchall() print(myresult) mydb.commit() mycursor.close() for x in myresult: print(x[0])
3 Réponses :
Vous avez écrit:
import pprint ... names = [name for name, in myresult] pprint.pprint(names)
Suite à cela, x
est toujours dans la portée,
vous pouvez donc utiliser des expressions impliquant x
à votre guise.
Supposons que votre variable préférée est v
.
Ensuite, après la boucle, vous pouvez attribuer par exemple:
... WHERE name LIKE 'a%'
Une meilleure façon d'exprimer votre boucle serait de décompresser le tuple:
for name, in myresult: print(name) v = name
Ici, nous décompressons un 1-tuple dans la variable chaîne name
.
Une requête plus sophistiquée demandant deux colonnes pourrait utiliser: pour le nom, l'âge dans mon résultat:
Maintenant, votre requête actuelle utilise un test d'égalité
donc il retournera zéro ou une ligne
(et l'affectation v
échouerait dans le cas de la ligne zéro "non trouvé").
Imaginez qu'au lieu de trouver simplement 'admin'
votre clause WHERE demandait tous les noms commençant par a
:
v = x[0]
Ensuite, il serait plus approprié de rassembler un liste de noms:
for x in myresult: print(x[0])
Le myresult
que vous avez obtenu de myresult = mycursor.fetchall ()
est une liste de tuples.
Avec for x dans myresult: code >,
x
reçoit chaque tuple de myresult
, l'un après l'autre. Et avec x [0]
vous accédez alors au premier élément de ces tuples.
Dans votre cas, il n'y a qu'un seul tuple, avec une seule valeur. Cela a du sens car votre SQL sélectionne le nom
de tous les enregistrements qui ont le nom 'admin'
- vous vérifiez essentiellement s'il y a des utilisateurs avec le nom ' admin '
. On ne sait pas pourquoi vous voulez obtenir ce nom, car il sera 'admin'
pour chaque enregistrement.
Vous pouvez y accéder directement comme ceci:
mycursor.execute ("SELECT COUNT(name) FROM account_database WHERE name = 'admin'") myresult = mycursor.fetchone() print(f'There are {myresult[0]} users named \'admin\'')
ie assignez la première valeur du premier enregistrement de myresult
à admin_name
, mais ce serait soit la même chose que admin_name = 'admin'
, soit générer un message d'erreur s'il n'y a pas d'utilisateur nommé 'admin'
dans la base de données.
Pour vérifier cela:
if len(myresult) == 0: print('There is no user named \'admin\'') else: print('There is a user named \'admin\')
Remarque: si vous souhaitez uniquement voir s'il existe des enregistrements portant ce nom, vous n'avez pas besoin non plus de .fetchall ()
, vous pouvez simplement utiliser .fetchone () . Ou vous pouvez même simplement exécuter une requête qui évite complètement les erreurs:
admin_name = myresult[0][0]
Ajoutez les valeurs à une liste.
final = [] for x in myresult: print(x[0]) final.append(x[0])
Je suppose que ma question est de savoir comment obtenir le résultat de for x dans mon résultat: print (x [0]) enregistré dans une variable