DatenbankMySQL

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
KiS
User
Beiträge: 19
Registriert: Samstag 29. April 2006, 07:26

Frage ich hab folgende tabelle:
Port Status
1 ?
2 ?
3 ?
4 ?

die Zahlen vom Port werden am Anfang des Programms abgefragt, also man kann eine Zahl für einen Port eingeben und diese wird dann das ganze Programm über verwendet. Meine Frage ist also wie kann ich die Zahl welche ich ganz am Anfang abgefragt habe (ist eine Variable) bekommen weil ich möchte mit der Funktion
Update tabelle
set Status='1'
where port=variable??????
die '1' ins Statusfeld bei dem dazugehörigen port eintragen. Vorsicht aber der Port ist eine Variable.
Also bitte kann mir wer helfen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die Zahl findest du in der Variable in der du sie abgespeichert hast.

FIndest du die Antwort nicht hilfreich? Kein Wunder, deine Frage ist ungenau. Wäre nett, wenn du Code posten könntest, dann sehen wir woran es hapert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
KiS
User
Beiträge: 19
Registriert: Samstag 29. April 2006, 07:26

Code: Alles auswählen

import MySQLdb
import os   
verbindung=MySQLdb.connect(host='localhost',db='watchdog',user='root',passwd='test')
c=verbindung.cursor()
c.execute('USE watchdog')
anz=c.execute('SELECT * FROM watchdog')
print anz
x=raw_input("Bitte gewünschten Port eingeben:")
print x 
anfrage1='''    
Select Reset
from watchdog
where port='''+x
c.execute(anfrage1)
a=c.fetchone()
print a 
while True:
    try:
        if a == ('0',):
            anfrage2='''
            Select IP1, IP2, IP3, IP4
            From watchdog
            where port='''+x
            c.execute(anfrage2) 
            var1=c.fetchone()[0]
            c.execute(anfrage2)
            var2=c.fetchone()[-3]
            c.execute(anfrage2)
            var3=c.fetchone()[-2]
            c.execute(anfrage2)
            var4=c.fetchone()[-1]
            ip=var1+"."+var2+"."+var3+"."+var4
            print ip                 
            c=os.system ("ping "+ip)
            print c
            if c == 0:
                'update watchdog'
                set
                Status='1'
                'where port=x'
                print x
                print 'ok'
            else:
                c.execute("""update watchdog
                set Status='2'
                WHERE port""")
                print 'server down'
            break
        else:
            c.execute("""update watchdog
            set Status='3'
            WHERE port""")
            print 'server neustart'
            break
        
    except ValueError:
        print "Bitte nochmal eingeben"


so das ist mein Text kann mir jetzt wer helfen???


Edit by Gerold: BITTE Code immer in Code-Tags einschließen. Python ist sonst nicht lesbar. --> http://www.python-forum.de/faq.php#21
BlackJack

KiS hat geschrieben:

Code: Alles auswählen

            anfrage2='''
            Select IP1, IP2, IP3, IP4
            From watchdog
            where port='''+x
            c.execute(anfrage2) 
            var1=c.fetchone()[0]
            c.execute(anfrage2)
            var2=c.fetchone()[-3]
            c.execute(anfrage2)
            var3=c.fetchone()[-2]
            c.execute(anfrage2)
            var4=c.fetchone()[-1]
            ip=var1+"."+var2+"."+var3+"."+var4
            print ip                 
Das sieht sehr, äh, interessant aus. Die selbe Anfrage die vier Werte aus der DB holt viermal auszuführen um dann jedesmal nur *einen* aller vier Werte aus dem Ergebnis zu holen und dann auch noch ab dem zweiten Wert von hinten her indexiert ist echt kreativ. ;-)

Probier' doch mal, ob Du es auch so schreiben könntest:

Code: Alles auswählen

            c.execute('SELECT ip1, ip2, ip3, ip4'
                      ' FROM watchdog'
                      ' WHERE port=%s', x)
            ip = '.'.join(c.fetchone())
            print ip
KiS
User
Beiträge: 19
Registriert: Samstag 29. April 2006, 07:26

Danke ich werds dann gleich mal ausprobieren und dir zurückschreiben ob es funktioniert hat. Kannst du mir vielleicht auch bei dem Problem helfen. Weil ich möchte dann noch wenn der ping erfolgreich ausgeführt wurde in die Datenbank, in die Tabelle watchdog, in die Spalte Status einen bestimmten Statuswert (1,2 oder 3) eintragen. Aber irgendwie passiert überhaupt nichts. Kannst du mir da vielleicht weiter helfen?

Code: Alles auswählen

 
if a == ('0',): 
                  c.execute('SELECT ip1, ip2, ip3, ip4' 
                  ' FROM watchdog' 
                  ' WHERE port=%s', x) 
                  ip = '.'.join(c.fetchone()) 
                  print ip
      if c == 0: 
                   'update watchdog' 
                   set 
                   Status='1' 
                   'where port=x' 
                   print x 
                   print 'ok' 
      else: 
            c.execute("""update watchdog 
            set Status='2' 
            WHERE port""") 
            print 'server down' 
            break 
else: 
      c.execute("""update watchdog 
      set Status='3' 
      WHERE port""") 
      print 'server neustart' 
      break
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Code: Alles auswählen

      else:
            c.execute("""update watchdog
            set Status='2'
            [color=red]WHERE port"""[/color])
            print 'server down'
            break 
zweimal hast du das gemacht...
eine funktionierende MySQL-Syntax wäre

Code: Alles auswählen

WHERE Port = port
Das andere sollte nicht funktionieren...
KiS
User
Beiträge: 19
Registriert: Samstag 29. April 2006, 07:26

Das heißt, dass ich einfach schreiben kann:

Code: Alles auswählen

else:
            c.execute("""update watchdog
            set Status='2'
            WHERE port = x""")
            print 'server down'
            break 
x ist ja ne variable. Am Anfang des Programms frag ich ja nach dem Port und der wird mit der Variablen x ausgegeben. kann ich das was du gesagt hast mit port=port so schreiben wie ichs grad geschrieben habe mit where port = x???? geht das?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

ja, das ist richtig...habe leider deine definition übersehen und einfach meine üblcihe genommen...aber da fällt mir auf: das wäre keine variable, es müsste

Code: Alles auswählen

else:
            c.execute("""update watchdog
            set Status='2'
            WHERE port =%i""" % x)
            print 'server down'
            break
heißen, da sonst der echt wert (x) angegeben werden würde
BlackJack

murph hat geschrieben:ja, das ist richtig...habe leider deine definition übersehen und einfach meine üblcihe genommen...aber da fällt mir auf: das wäre keine variable, es müsste

Code: Alles auswählen

else:
            c.execute("""update watchdog
            set Status='2'
            WHERE port =%i""" % x)
            print 'server down'
            break
heißen, da sonst der echt wert (x) angegeben werden würde
Bitte keine Werte mit '%' in SQL-Anweisungen hineinformatieren sondern das immer das Datenbankmodul machen lassen, das ist sicherer.

@Kis: Bitte schau Dir doch nochmal meine Abfrage an, da wird ja auch eine Variable in die Abfrage eingesetzt.

Und Du darfst natürlich nicht den `commit()` Aufruf auf dem Connection-Objekt nach Änderungen in der Datenbank vergessen, damit die auch wirklich wirksam werden. Oder am Anfang einmal mit `autocommit()` dafür sorgen das Änderungen immer sofort ausgeführt werden.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

BlackJack hat geschrieben:Und Du darfst natürlich nicht den `commit()` Aufruf auf dem Connection-Objekt nach Änderungen in der Datenbank vergessen, damit die auch wirklich wirksam werden. Oder am Anfang einmal mit `autocommit()` dafür sorgen das Änderungen immer sofort ausgeführt werden.
Oh man, danke. Da meine SELECTs immer so ausgeführt wurden, bin ich nicht auf die Idee gekommen das es bei einem INSERT noch ein commit braucht. War schon kurz vorm verzweifeln weil in der DB nie was drinstand... eine Zeile mehr, und auf einmal funktioniert es :)
Antworten