sqlite - mehrere Zeilen mit einem Klick?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Für meine kleines Bibliotheken-App muss ich dem Buch ein oder mehrere Autoren zuweisen. Dies mache ich über eine Zwischentabelle namens buchautor. Wenn ein Buch nun mehrere Autoren hat - was bei Fachbüchern die Regel ist, dann habe ich bis jetzt immer einzeln das Buch ausgewählt und den Autor. Diese Prozedur habe ich dann solange wiederholt, bis ich alle Autoren dem Buch zugewiesen habe (siehe Code unten).

Nun stellt sich mir die Frage, ob ich mittels Mehrfachauswahl (html <select .... multiple>) die Autoren mit einem "klick" zuweisen kann.

Dafür müsste ich aber eine Art Schleife einbauen, welche die Anzahl ausgewählter Autoren ausliest und dann diese mit der buchID in mehrere Zeilen einfügt?
Gibt es da eine Möglichkeit bzw hätte jemand eine Idee dafür?


DB

autor:
id | name

buch:
id | titel

buchautor:
buchID | autorID

app.py:

Code: Alles auswählen

            con = sqlite3.connect('bibliothek.db')
            cur = con.cursor()
            con.text_factory = str
            sql3="""INSERT INTO buchautor VALUES (?,?)"""
            cur.execute(sql3,(buchID,autorID))
            con.commit()
            cur.close()
template.tpl:

Code: Alles auswählen

      <label><br>
        Buch: <br>
        <select name="buchID" id="buchD">
          
   %for row in rows2:
   %txt = u"%s" % (row[1])
    
          <option value ="{{row[0]}}">{{txt}}</option>
          
    %end
    
        </select>
      </label>
      <br>
      <br>
      <label>Autor:<br>
        <select name="autorID" id="autorID">
          
   %for row in rows1:
   %txt = u"%s %s" % (row[1],row[2])
    
          <option value ="{{row[0]}}">{{txt}}</option>
          
    %end
    
        </select>
      </label>
Zuletzt geändert von Leonidas am Donnerstag 15. November 2012, 12:34, insgesamt 2-mal geändert.
Grund: "Solved" gelöscht
Sirius3
User
Beiträge: 17755
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo lackschuh,

ja, Schleifen sind eine gute Idee.
Wie verarbeitest Du die Formulardaten?
Welches Framework nutzt Du?

Grüße
Sirius
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hi

1: mit request.GET also:

Code: Alles auswählen

    if request.GET.get('save',''):
        buchID = request.GET.get('buchID')
        autorID = request.GET.get('autorID')
2: ich benutze bottle

So schaut's aus, was aber ohne Schleife noch nicht geht.
Bild
Sirius3
User
Beiträge: 17755
Registriert: Sonntag 21. Oktober 2012, 17:20

Da <select ... multiple> mehrmals authorID zurückliefert muß die Abfage dann so heißen:

Code: Alles auswählen

if request.GET.get('save',''):
        buchID = request.GET.get('buchID')
        for autorID in request.GET.getall('autorID'):
            insert(buchID,authorID)
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Vielen Dank mal für den Input. Das Problem liegt wahrscheinlich bei der Zwischentabelle. Hier ist pro Zeile (row) nur ein Wert erlaubt. Bei mehreren Autoren sieht's wie folgt aus:

buchautor:
buchID | autorID
0001 | 0010
0001 | 0011
0001 | 0012

Bild

Anbei mal der komplette Code inkl. der Abfrage:

Code: Alles auswählen

@route('/new_buchautor', method='GET')
def buchautor():
    con = sqlite3.connect('bibliothek.db')
    cur = con.cursor()
    
    sql ="""SELECT id,nachname, vorname,REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
                       REPLACE(nachname, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'),
                       'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's'), 'd', 'D'), 'm', 'M'), 'p', 'P'), 's', 'S'), 'v', 'V') AS sortiert FROM autor ORDER BY sortiert"""
    sql2 = """SELECT id,titel,REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(
                       REPLACE(titel, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'),
                       'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's'), 'd', 'D'), 'm', 'M'), 'p', 'P'), 's', 'S'), 'v', 'V') AS sortiert FROM buch ORDER BY sortiert""" 
    cur.execute(sql)
    result1 = cur.fetchall()
    cur.execute(sql2)
    result2  = cur.fetchall()
    
    if request.GET.get('save',''):
        buchID = request.GET.get('buchID')
        autorID = request.GET.get('autorID')
        ####
        try:
            con = sqlite3.connect('bibliothek.db')
            cur = con.cursor()
            con.text_factory = str
            #sql3="""INSERT INTO buchautor VALUES (?,?)"""
            sql3="""INSERT INTO test VALUES (NULL,?,?)"""
            cur.execute(sql3,(buchID,autorID))
            con.commit()
            cur.close()
        
            tpl = template('layout.tpl')
            t = Template(tpl)
            nachricht = '<p>Buch mit ID <b>%s</b> erfolgreich dem Autor <b>%s</b> zugewiesen.</p>' % (buchID,autorID)
            return t.substitute(content= nachricht)
        
        except:
            tpl = template('layout.tpl')
            t = Template(tpl)
            error = "<p>Buch mit ID <b>%s</b> bereits mit AutorID <b>%s</b> zugewiesen!</p>" % (buchID,autorID)
            return t.substitute(content= error)   
    else:
        tpl = template('layout.tpl')
        buchautor = template('new_buchautor.tpl',rows1=result1,rows2=result2)
        t = Template(tpl)
        return t.substitute(content= buchautor)  
Sirius3
User
Beiträge: 17755
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier ist pro Zeile (row) nur ein Wert erlaubt.
Ja genau, und da kommt die for-Schleife ins Spiel: für jeden Autor wird zu BuchID ein weiterer Eintrag eingefügt.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Sirius3 hat geschrieben:
Hier ist pro Zeile (row) nur ein Wert erlaubt.
Ja genau, und da kommt die for-Schleife ins Spiel: für jeden Autor wird zu BuchID ein weiterer Eintrag eingefügt.
Tausend Dank. Es geht. Das Zauberwort war wohl getall

Code: Alles auswählen

request.GET.getall('autorID')
<-- kannte ich nicht.
Antworten