SQlite und BottlePy, Zugriff auf einzelne Spalten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Hi mal wieder ein Frage...
Da mir hier stets freundlichst und problemlösend geantwortet wurde, mal ein Danke an die reizende Community. Danke!

Folgende Informationen zur Datenbank als Beispiel:
Tabelle: tp.A
Spalten: A B C
Das abfragen ist kein Problem.

Code: Alles auswählen

c = conn.cursor()		
c.execute("SELECT * FROM tp.A WHERE C LIKE '1'")
result = c.fetchall()
return dict(page='showlist', rows=result)
Dann gebe ich das ganze an ein BottlePy Template.
Auch kein Problem.

Code: Alles auswählen

<table border="1">
 %for row in rows:
  <tr>
  %for col in row:
   <td><img src="{{col}}" alt="imgur load"></td>
  %end
  </tr>
 %end
</table>
Nehmen wir mal an Spalte B enthält einen Link zu einem Bild.
Wie kann ich jetzt direkt auf B zugreifen? Sprich das in {{col}} der Wert (Inhalt) von B steht.

Klar ich könnte nur B abfragen im SQL String, aber das ist ja glorreicher Quatsch.

In PHP vermag man z.B, so etwas feines zu machen:

Code: Alles auswählen

MySQL
$sql = "SELECT * FROM tp.A WHERE C LIKE '1'";
$query = mysql_query($sql);
while ($zeile = mysql_fetch_array($query)){
 echo "<img src="
 .$zeile["B"] ." />";
}

SQLite
$result = $db->query("SELECT * FROM tp.A WHERE C LIKE '1'");
 foreach($result as $row){
  $cover = $row['B'];
}
Vielen Dank für eure Aufmerksamkeit.

greatz
Zuletzt geändert von seishin am Donnerstag 29. Dezember 2011, 16:33, insgesamt 1-mal geändert.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Nein, dann ist für jede Zeile der Wert row[1]...
Wenn ich {{col[1]}} nehme erhalte ich einen Typ Error:
<td><img src="{{col[1]}}" alt="load"></td>
TypeError: 'int' object is not subscriptable
deets

Ich verstehe dein Problem nicht. Jede Zeile der Datenbank ist ein Tupel aus drei Werten - den abgefragten Spalten A, B, C.

Was du in deinem *urspruenglichen* Code machst ist, dort dann ebenfalls drueber zu iterieren, und dann eine Tabellenzelle darzustellen.

Wenn du das nicht moechtest (und so hoerte sich das an), sondern willst direkt auf B zugreifen, dann musst du eben in der Zeile auf die Spalte indizieren.

Man kann manche DB-Adapter auch so konfigurieren, dass sie Dictionaries zurueckliefern, das ist dann aber nicht fundamental anders.

Und es erschliesst sich mir nicht, was du mit "dann ist fuer jede Zeile der Wert row[1]" meinst. Das der Fehler kommt ist klar - denn du iterierst ja ueber deine Spalten, und eine Spalte selbst ist keine Liste mehr.

Lass dir doch mal deine Datenbankabfrage auf der Konsole ausgeben, mit pprint.pprint - dann siehst du, wie die Struktur ist.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Und es erschliesst sich mir nicht, was du mit "dann ist fuer jede Zeile der Wert row[1]" meinst.
Im HTML Code

Code: Alles auswählen

<img src="row[1]" alt="load">
Weswegen ich vermute das in BottlePy eine andere Art, möglich sein müsste. Auf die Elemente der Tupel zu zugreifen.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

So hier funktionierts!

Code: Alles auswählen

<table border="1">
				%for row in rows:
					<tr><td><img src="{{row[1]}}" alt="imgur load"></td>
					</tr>
				%end
			</table>
Und ohne die zweite Schleife.

Danke für den Denkanregung!

Gruß und schönen Abend.
Antworten