Comment vérifier si l'enregistrement existe avec Python MySQdb
Im la création d'un programme en python qui se connecte à mysql.
j'ai besoin de vérifier si une table contient le numéro 1 pour montrer qu'il s'est connecté avec succès, c'est mon code donc loin:
xcnx.execute('CREATE TABLE settings(status INT(1) NOT NULL)')
xcnx.execute('INSERT INTO settings(status) VALUES(1)')
cnx.commit()
sqlq = "SELECT * FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
results = xcnx.fetchall()
if results =='1':
print 'yep its connected'
else:
print 'nope not connected'
qu'ai-je manqué? je suis un sql noob, merci les gars.
Voulez-vous simplement de vérifier que vous pouvez établir une connexion à la base de données, ou que vous pouvez réussir à créer des tables et insérer des données?
nan je sais que je peux me connecter de créer et d'insérer, j'ai juste besoin de savoir comment contrôler et de vérifier si un enregistrement existe.
nan je sais que je peux me connecter de créer et d'insérer, j'ai juste besoin de savoir comment contrôler et de vérifier si un enregistrement existe.
OriginalL'auteur | 2012-11-14
Vous devez vous connecter pour publier un commentaire.
Je crois que le plus efficace "existe-t-elle de la requête", c'est juste pour faire un
count
:Au lieu de demander à la base de données pour effectuer n'importe quel nombre d'opérations sur des champs ou des lignes, vous êtes en train de demander le retour d'un 1 ou 0 si le résultat produit toutes les correspondances. C'est beaucoup plus efficace que le retour des documents et de comptage de la quantité côté client car il permet d'économiser de la sérialisation et la désérialisation sur les deux côtés, et le transfert de données.
count(*)
va être le même quecount(1)
. Dans votre cas parce que vous êtes la création d'une nouvelle table, il va montrer 1 résultat. Si vous avez 10 000 matchs il serait 10000. Mais tout ce que vous aimez dans votre test est de savoir si il n'est PAS 0, de sorte que vous pouvez effectuer un bool vérité test.Mise à jour
En fait, il est même plus rapide d'utiliser le nombre de lignes, et pas même aller chercher les résultats:
C'est aussi la façon dont l'ORM de django un
queryObject.exists()
.COUNT(*)
est un cas particulier où une ligne est en fait revenue, même dans le cas d'un non-match (la ligne juste en contient le numéro 0).J'ai juste corrigé mon exemple, pour utiliser le minimum de traitement possible de vérifier l'existence de la requête. Faire un
count(1)
est encore plus petit. Et vous allez voir le premier résultat pour une seule int.+1, vous avez mon vote 🙂
Merci. Il est similaire à votre réponse, si je suis juste en se concentrant sur la
count
et si elle renvoie zéro.Ouais, semble plus intelligent/plus efficace de cette façon (et il se débarrasse de la laide
[0][0]
. La logique qui prévaut à nouveau 🙂OriginalL'auteur jdi
Si tout ce que vous voulez faire est de vérifier si vous avez réussi à établir une connexion, alors pourquoi êtes-vous en train de créer un tableau, insérer une ligne, puis de récupérer des données à partir d'elle?
Il vous suffit d'effectuer les opérations suivantes...
En fait, si votre programme n'a pas jeté une exception à ce jour indique que vous avez établi la connexion avec succès. (Vérifier le code ci-dessus, je ne suis pas sûr si fetchone sera de retour d'un n-uplet, string ou int dans ce cas).
Par ailleurs, si pour une raison quelconque vous avez besoin de créer la table, je suggère de le laisser tomber avant de vous quitter, de sorte que votre programme s'exécute avec succès la deuxième fois.
OriginalL'auteur Verma
Lorsque vous exécutez
results = xcnx.fetchall()
, la valeur de retour est une séquence de n-uplets qui contiennent les valeurs de ligne. Par conséquent, lorsque vous vérifiez siresults == '1'
, vous êtes en train de comparer une séquence à une constante, qui sera de retourFalse
. Dans votre cas, une seule rangée de valeur0
sera retourné, de sorte que vous pouvez essayer ceci:Vous pouvez également utiliser un
DictCursor
(lors de la création du curseur, utilisez.cursor(MySQLdb.cursors.DictCursor
) ce qui rendrait les choses un peu plus faciles à interpréter codewise, mais le résultat est le même:Aussi, pas une grosse affaire dans ce cas, mais vous êtes en comparant une valeur entière à une chaîne. MySQL va faire la conversion de type, mais vous pouvez utiliser
SELECT COUNT(*) FROM settings WHERE status = 1
et enregistrer un (tout petit) peu de traitement.OriginalL'auteur RocketDonkey
Récemment, j'ai amélioré mon efficacité par la place de l'interrogation de sélectionner, juste l'ajout d'un primaire index unique sur la colonne, puis de l'ajouter. MySQL ne l'ajouter si elle n'existe pas.
Donc au lieu de 2 états:
Viens de faire 1 et il ne fonctionnera que si elle est unique:
1 de la Requête est mieux que 2.
OriginalL'auteur User