Immer aktuelle DB Inhalte auslesen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
maria84
User
Beiträge: 4
Registriert: Freitag 5. Dezember 2008, 14:22

Hallo!
Zu allererst moechte ich sagen, dass ich noch etwas neu beim python programmieren bin, deswegen hoff ich, dass diese frage nicht zu trivial ist und ich es einfach nicht kapier...

also nun zu meinem probelm. bei mir findet sich folgendes szenario. ich lese server-seitig daten aus der datenbank aus und schicke das per xmlrpc zum client bzw der client holt sich die gewuenschten daten. nun versuche ich, dass am client immer die aktuellsten daten angezeigt werden, d.h. ich lasse die registrierte rpc-methode am client einer schleife ausfuehren und aendere nebenbei (derzeit noch per hand) gewisse inhalte in der datenbank. das problem ist jetzt nur, dass mir die aktualisierten daten einfach nicht uebermittelt werden. ich stell am besten einfach mal den code meiner scripts hier rein, vielleicht ist das problem ja offentsichtlich. aber ich konnte hier im forum nichts passendes finden...

marathon.py - client script
verbindet sich zum server und fuehrt die methode aus, die die daten aus der datenbank ausliest.

Code: Alles auswählen

import xmlrpclib

class MarathonPlugin(object):
    
    proxy = xmlrpclib.ServerProxy('http://localhost:3000')        
    
    def showFavRunner(self):
        print self.proxy.getFavRunner(1)       


mp = MarathonPlugin()

while 1:
    try:
        mp.showFavRunner()
    except KeyboardInterrupt:
        print 'Client stopped...'
database.py - Datenbank zeugs
verbindet sich zur datenbank, lest die daten aus und gibt einen string zurueck

Code: Alles auswählen

import MySQLdb
import runner
import time
import datetime

class DataBase(object):
    "Class for connecting to the database and returning the right values"
    
    #variables for the connection to the database
    __host = 'localhost'
    __user = 'root'
    __passwd = ''
    __port = 4000
    __db = 'marathon'
    __conn = 'test';
    
    
    ###############
    ##INIT METHOD##
    ###############
    def __init__(self):
        "connects to the database"
        
        #try to connect to Database - fix at server, table is not fixed
        try:
            self.__conn = MySQLdb.connect(self.__host, self.__user, self.__passwd, self.__db, self.__port)
            self.__cursor = self.__conn.cursor();
            print 'Connected.'
        except MySQLdb.Error, e:
            print "Cannot connect to server.\nError %d: %s" % (e.args[0], e.args[1])
            sys.exit(1);
       
       
            
    #################################
    ##GET INFO FROM FAVORITE RUNNER##
    #################################
    def getFavRunner(self, clientID):
        "returns Runner object with necessary data in it"
        
        favoriteInfo = ''
                
        #try to make query to get data from given table
        try:
            self.__cursor.execute('SELECT runID FROM clients WHERE client_id = %s' % (clientID))
            row = self.__cursor.fetchall();
            
            for entry, in row:
                runID = entry;                
                            
            #return the right runner value depending on his runID
            favoriteInfo = self.getRunner(runID);
            
            #cursor.close()
                
        except MySQLdb.Error, e:
            print 'query failed to get right CLIENT: ', e
            
        return favoriteInfo 
 
        
    ############################
    ##GET INFO FROM ANY RUNNER##
    ############################
    def getRunner(self, runID):    
        "gets Info from a runner from the right table in the database"           
                
        wantedRunner = runner.Runner();    #RUNNER to return          
        print runID
        
        try:
            self.__cursor.execute("SELECT * FROM runners WHERE runID = %s" % (runID))
            rows = self.__cursor.fetchall();

            for row in rows:
                wantedRunner.startnumber = row[0]
                wantedRunner.km = row[1]
                #wantedRunner.runtime = datetime.timedelta(row[2])
                wantedRunner.runID = runID
                wantedRunner.position = row[4]
                wantedRunner.ageGroupPos = row[5]
                wantedRunner.ageGroup = row[6]
                #wantedRunner.bruttotime = datetime.timedelta(row[7])
                wantedRunner.name = row[8]
         
            print self.__cursor.rowcount, 'rows were returned'
            #cursor.close()
            
        except MySQLdb.Error, e:
            print 'query failed to get RUNNER INFO: ', e
        
        #return the wanted runner object
        return wantedRunner.printInfo()
server.py - xmlrpc server
befasst sich mit dem xmlrpc server zeugs und registriert die passende klasse, von welcher der client methoden ausfuerhen kann.

Code: Alles auswählen

import SimpleXMLRPCServer
import xmlrpclib
import logging
import os
import database

#Set up logging
logging.basicConfig(level=logging.DEBUG)

#create XML RPC server who is listening for incoming requests at localhost
server = SimpleXMLRPCServer.SimpleXMLRPCServer(('localhost', 3000))

db = database.DataBase()

#register function at server
server.register_instance(db)

try:
    print 'Use Control-C to exit'
    server.serve_forever();
except KeyboardInterrupt:
    print 'Exiting' 
Ich hoffe wirklich irgendwer kann mir weiterhelfen. Falls ich noch weitere Infos reinstellen soll, ist das natuerlich gar kein Problem. Bin nicht so gut beim Erklaeren eines Problems. Ich hoffe ich hab mich ungefaehr klar ausgedrueckt.
Schon mal danke im Voraus an den/die Helfer, falls sich hoffentlich wer findet!
LG, Maria[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo maria84, willkommen im Forum,

Hast du Transaktionen als Grund für dein Problem schon ausgeschlossen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
maria84
User
Beiträge: 4
Registriert: Freitag 5. Dezember 2008, 14:22

Hallo Leonidas!
Grundsaetzlich habe ich nichts ausgeschlossen.
Auch wenn die Frage jetzt bloed klingen mag...aber wie koennte ich hier Transaktionen (nehme an du meinst solche Dinge wie commit(), ...) hier anwenden?
LG, Maria
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, wenn du eine Transaktion am laufen hast wirst du die geänderten Werte in der Datenbank so lange nicht sehen, bis die Transaktion zuende ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
maria84
User
Beiträge: 4
Registriert: Freitag 5. Dezember 2008, 14:22

ah...ja jetzt hab ichs schon kapiert...stand grad auf der leitung.
nein, da laufen keine transaktionen. die aktuellen daten aus der db werden mir nur ausgegeben, wenn ich den server neu starte.
aber irgendwie kapier ich das nicht, warum das so ist, weil ich prinzipiell die abfrage ja ueber den client aufrufe.

die datenbank editiere ich zur zeit ueber den mySQL Query Browser, d.h. es sind eben nur einzelne befehle keine transaktionen.

koennte es sein, dass ich - bevor ich eine neue abfrage per cursor.execute ausfuehre - die verbindung zur datenbank aktualisieren muss, oder irgendsowas. diese vermutung ist jetzt nur so aus der luft gegriffen...hab nicht wirklich eine ahnung wo i da ansetzen koennte...

lg, maria
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

maria84 hat geschrieben:koennte es sein, dass ich - bevor ich eine neue abfrage per cursor.execute ausfuehre - die verbindung zur datenbank aktualisieren muss, oder irgendsowas.
Mach mal ein ``commit()`` oder ``rollback()`` mit deinem Cursor.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

[wiki]DB Transaktionen[/wiki] :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
maria84
User
Beiträge: 4
Registriert: Freitag 5. Dezember 2008, 14:22

Tatsächlich...dem Code fehlte nur ein commit(). Also manchmal denkt man schon etwas zu kompliziert...
Pah...vielen Dank!!! Hab ich wieder was dazugelernt und gesehen, dass ich mich wohl noch etwas besser mit diesem Thema beschäftigen sollte!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:[wiki]DB Transaktionen[/wiki] :lol:
Das ist dort nicht beschrieben gewesen, aber gute Idee, hab' das Verhalten dort mal dokumentiert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten