DatenbankMySQL

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

DatenbankMySQL

Beitragvon KiS » Donnerstag 4. Mai 2006, 11:50

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 4. Mai 2006, 15:39

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 Modvoice
KiS
User
Beiträge: 19
Registriert: Samstag 29. April 2006, 07:26

Datenbank MySQL update Problem

Beitragvon KiS » Donnerstag 11. Mai 2006, 13:53

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

Re: Datenbank MySQL update Problem

Beitragvon BlackJack » Donnerstag 11. Mai 2006, 22:25

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

Beitragvon KiS » Freitag 12. Mai 2006, 06:38

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:

Beitragvon murph » Freitag 12. Mai 2006, 15:16

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

Beitragvon KiS » Freitag 12. Mai 2006, 19:12

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:

Beitragvon murph » Freitag 12. Mai 2006, 20:56

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

Beitragvon BlackJack » Samstag 13. Mai 2006, 07:46

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

Beitragvon Nirven » Freitag 8. September 2006, 10:43

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 :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder