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