Sve@r | axel584 a écrit :
Bonjour,
J'ai un peu l'habitude de faire des scripts pythons en mode texte pour faire des modifs en base de données, et là, je dois faire un petit site en PSP.
Pour l'instant, j'ai fait des pages qui contienne un import : from configdb import *
Et un fichier configdb.py qui contient ça :
Code :
- try:
- connectionMy = MySQLdb.connect(host = "XXX", user = "YYY", passwd = "ZZZ", db = "AAA",use_unicode=1)
- except OperationalError:
- req.write("Unable to connect to database: %s" % message)
|
Mais j'ai l'impression que la "connection" est parfois perdu et je ne comprends pas très bien comment les choses fonctionnent quand deux personnes se connectent en même temps ? Est ce qu'il y a un seul objet connectionMy qui est utilisé par les deux personnes ? est ce qu'il y a un nouvel objet connectionMy à chaque fois que quelqu'un accède à la page ?
Bref, ne comprenant pas trop comment ça fonctionne, j'ai du mal à savoir comment je pourrais corriger les choses.
Merci pour votre aide,
Axel
|
C'est plus une question spécifique aux bdd qu'à Python. Chaque connection à une bdd est gérée par le serveur. Il attribue au client un identificateur de connection.
Ensuite, quand le serveur reçoit une requête, il sait de qui ça vient grâce à l'identificateur qui est associé.
Le vrai problème peut survenir si les deux clients modifient la même info d'une même table en même temps. Si la modif est faite de façon banale, alors le serveur recevant les deux requêtes les exécutera en séquentiel et c'est la dernière qui gagnera.
Généralement, pour éviter ce genre de cas, on pose un verrou sur l'enregistrement en cours de traitement. Le verrou peut-être en mode "lecture seule" (les autres peuvent toujours lire l'info mais pas la modifier) ou en mode "exclusif".
Pour en revenir à Python, j'ai découvert un problème justement à propos de l'info visualisée.
Voici 2 scripts
script1.py: il crée une bdd et une table et il y stocke 3 infos. Puis il va lire les infos, attend ensuite une frappe clavier puis relit les infos
Code :
#!/usr/bin/env python # coding: Latin-1 -*- # Programme principal # Paramètres de travail __serveur="localhost" __user="mysql" __passwd="mot de passe de mySQL" __bdd="toto" __table="tbl" import MySQLdb # Partie 1: Création bdd id=MySQLdb.connect(__serveur, __user, __passwd) c=id.cursor() c.execute("drop database if exists %s" % __bdd) c.execute("create database %s" % __bdd) c.close() id.close() # Partie 2: Création et remplissage table id=MySQLdb.connect(__serveur, __user, __passwd, __bdd) c=id.cursor() c.execute("create table %s (nom char(20), prenom char(20))" % __table) c.close() c=id.cursor() c.execute("insert into %s (nom, prenom) values('Valjean', 'Jean')" % __table) c.execute("insert into %s (nom, prenom) values('Hugo', 'Victor')" % __table) c.execute("insert into %s (nom, prenom) values('Javert', 'Paul')" % __table) c.close() id.commit() id.close() # Partie 3: Affichage n° 1 print print "Affichage 1" id=MySQLdb.connect(__serveur, __user, __passwd, __bdd) c=id.cursor() c.execute("select * from %s order by nom" % __table) print c.fetchall() print "%d lignes\n" % c.rowcount c.close() # Partie 4: Attente print raw_input("Attente - Permet de lancer autre chose - Appuyer sur <return> pour continuer" ) # Partie 5: Affichage n° 2 print print "Affichage 2" c=id.cursor() c.execute("select * from %s order by nom" % __table) print c.fetchall() print "%d lignes\n" % c.rowcount c.close() id.close()
|
script2.py: il se connecte à la bdd et y insère des data
Code :
#!/usr/bin/env python # coding: Latin-1 -*- # Programme principal # Paramètres de travail __serveur="localhost" __user="mysql" __passwd="mot de passe de mySQL" __bdd="toto" __table="tbl" import MySQLdb # Partie 1: Insertion dans table id=MySQLdb.connect(__serveur, __user, __passwd, __bdd) c=id.cursor() c.execute("insert into %s (nom, prenom) values('Victor', 'Paul-Emile')" % __table) c.execute("insert into %s (nom, prenom) values('Emile', 'Paul-Victor')" % __table) c.close() id.commit() id.close() # Partie 2: Affichage unique print print "Affichage" id=MySQLdb.connect(__serveur, __user, __passwd, __bdd) c=id.cursor() c.execute("select * from %s order by nom" % __table) print c.fetchall() print "%d lignes\n" % c.rowcount c.close() id.close()
|
Donc le principe est de lancer le script1. Il crée la bdd, puis la table, puis il la remplit puis l'affiche et se met en attente d'une frappe clavier.
Pendant qu'il est en attente, on lance le script2 autant de fois qu'on désire. A chaque lancement, il stocke 2 infos dans la table puis l'affiche. On voit ainsi la table grossir.
On revient enfin au script1 et on valide la saisie. Le script1 réaffiche le contenu de la table. Théoriquement, on devrait avoir toutes les infos insérées par le script2. Or, sous Windows, on n'a que les infos du début. Si on veut tout avoir, il est nécessaire de refaire un connect(). Il semblerait que l'interface windows d'accès à MySQL conserve en cache les data. Ce problème ne se produit pas sous Linux... ---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
|