Problem bei mehreren Rückgabewerten aus der DB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

Hallo,

habe ein Problem wenn ich mehrere Werte z.B. bei email zurückbekomme es wird dann immer nur ein Wert übergeben.

Code: Alles auswählen


def abfrage():
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')"
    cur = conn.cursor() 
    cur.execute(sql)
    data = cur.execute(sql)

    if (data is not 'NULL'): 
        item = 0
        for item in data: 
            print item[2]
            print item[3]
            print item[4]
            datum = item[2]
            mess = item[3]
            mailad =item[4]
            return (mailad, mess, datum)
abfrage()

def versenden(mailad,mess,datum):
    
    Email( 
        from_address = "SLiMS Datenbank", 
        to_address = mailad, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank "
    ).send()
mailad,mess,datum = abfrage()
versenden(mailad,mess,datum)


Wenn nur eine Software Lizenz abläuft ist es kein Problem es wird eine Email ausgelesen eine Message und das Datum, was kann ich aber machen wenn ich zwei Mailadressen bekomme und 2 Mails versenden muss?

danke HP
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oha ... das sieht teilweise grausig aus ;-)

Aber zunächst einmal ein Verständnisproblem: Wie / wo sollen denn 2 Emailadressen "zurückkommen"? Was genau kann denn in dem Feld "email" in der DB stehen? (Wobei es selbst bei Nicht-Atomarität kein problem sein sollte!)

Außerdem führst du das execute 2x aus ... imho sinnlos.

Dann felt mir ein

Code: Alles auswählen

result = cur.execute(sql)
data = result.fetchrow()
for i in data:
    ...
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

Ich bin nicht der Oberprogrammierer, für mich ist in erster Linie wichtig das es funktioniert :) :)
Natürlich bin ich gegenüber besserer Codierung aufgeschlossen und für jeden Tipp dankbar. ;)

Zur Funktion wenn eine Software (datum) abläuft dann sollen eben gewisse Leute via Email verständigt werden.
Solange nur eine Software abläuft kein Problem, wenn es aber zwei sind dann soll eben an 2 verschiedene Leute eine Mail versendet werden und dies funktioniert eben noch nicht.

danke HP
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, Du rufst ja in zeile 31 deine Mail-Versende-Funtkion nur 1x auf! Zudem liefert Zeile 30 ja nur den ersten Eintrag zurück! (Du retunrst etwas aus einer For-Schleife, was imho an sich schon mal unschön ist!)

Ich denke Du solltest Deine Struktur so anpassen:

Code: Alles auswählen

def send_mail(daten):
    # Hier eine Mail versenden

def get_expired():
    # hier sql query druchführen und über Ergebnisse iterieren
    # pro ergebnis send_mail aufrufen

def main():
    # Hier DB initialisieren / cursor holen ...

if __name__ == "__main__":
    main()
Und mach das doppelte execute weg :-D Und nutze das fetchall()!
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

Hallo,

danke erstmal jetzt ist es mir klarer leider funktioniert das mit meiner Iteration noch nicht so wirklich, kann mir vielleicht einer sagen wieso ?

Code: Alles auswählen

def abfrage():
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')"
    cur = conn.cursor() 
    data = cur.execute(sql)
    

    for (mail, mess, datum) in data:
            
        for item in data:
            print item[2]
            print item[3]
            print item[4]
            datum = item[2]
            mess = item[3]
            mail = item[4]
        send_mail(mail, mess, datum)
                                                                                                                            
def send_mail(mail, mess, datum):
    
    Email( 
        from_address = "SLiMS", 
        to_address = mail, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank "
    ).send()
#mail, mess, datum = abfrage()
#send_mail(mail, mess, datum)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Weil Du send_amil() eben nicht innerhalb der Schleife aufrufst ;-)
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

:D Ok aber es kommt keine Fehlermeldung und mails bekomm ich auch keine :(.
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

Hallo,

ich komm leider echt nicht drauf warum es nicht funktioniert, wäre dankbar wenn mir einer helfen könnte.

Code: Alles auswählen

def abfrage(): 
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')" 
    cur = conn.cursor() 
    cur.execute(sql)
    rows=cur.fetchall()

    for row in rows:        
        for item in row: 
            item =0
            datum = item[2] 
            mess = item[3] 
            mail = item[4] 
            send_mail(mail, mess, datum) 
        
abfrage()                                                                                                                     
def send_mail(mail, mess, datum): 
    
    Email( 
        from_address = "SLiMS", 
        to_address = mail, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank " 
    ).send() 
send_mail(mail, mess, datum) 
ich muss sagen mit den Variablen Übergaben kenn ich mich echt nicht gut aus und wann ich die Funktion aufrufen soll usw.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

hpa hat geschrieben:ich komm leider echt nicht drauf warum es nicht funktioniert, wäre dankbar wenn mir einer helfen könnte.
Cool, ohne Fehlermeldung geht es uns da ganz ähnlich. Ich vermute mal, dass ``send_mail`` nicht gefunden wird, wenn ``abfrage`` läuft.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

Hi,

das ist die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 48, in <module>
    abfrage()                                                                                                                     
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 43, in abfrage
    datum = item[2] 
TypeError: 'int' object is unsubscriptable
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

Wenn ich abfrage() auskommentiere kommt diese Fehlermeldung.

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 57, in <module>
    send_mail(mail, mess, datum) 
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 55, in send_mail
    message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank " 
TypeError: cannot concatenate 'str' and 'tuple' objects
hpa
User
Beiträge: 49
Registriert: Donnerstag 18. Oktober 2007, 16:56

So nach langem rumprobieren jetzt funktionierts :)

Code: Alles auswählen

def abfrage(): 
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')" 
    cur = conn.cursor() 
    cur.execute(sql)
    rows=cur.fetchall()
    #print result

    for row in rows:        
        print row[2]
        print row[3]
        print row[4]
        datum = row[2] 
        mess = row[3] 
        mail = row[4] 
        send_mail(mail, mess, datum) 
        
                                                                                                                   
def send_mail(mail, mess, datum): 
    
    Email( 
        from_address = "SLiMS", 
        to_address = mail, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank " 
    ).send() 
abfrage() 
Antworten