pyodbc.Row umwandeln

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Hallo Zusammen

Nach Zugriff auf eine MSSQL Datenbank liegen meine Ergebnisse als Liste von pyodbc.Row vor. Nun würde ich gerne mit den Ergebnissen rechnen, hierzu müssen die aber umgewandelt werden!

Meine Daten sehen ungefähr so aus

Code: Alles auswählen

print(row)
Output --> [(1056, ), (651, ), (612, ), (179, ),... typ: list

print(row[0])
Output --> (1056, ), typ: pyodbc.Row

print(row[0][0])
Output --> 1056 typ: Int
Ich könnte eine Schleife schreiben und jeden Eintrag separat auspacken, da es aktuell "nur" 300 Stk sind, spricht wenig dagegen.

Aber diesen Post schreibe ich, weil ich mir nicht vorstellen kann, dass das mit der Schleife ein effizienter Weg ist. Kennt ihr vielleicht einen besseren Weg wie ich anschließend mit den Daten rechnen kann?

Vielen Dank
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie schon an anderer Stelle angemerkt: row ist falsch, da es sich um mehrere Zeilen aus der DB handelt. rows waere also angemessen. Und wenn man jede Zeile betrachten will, dann ist eine for-Schleife schon das, was man da machen muss. Das wurde dir doch auch gezeigt, oder nicht?

Code: Alles auswählen

for row in rows:  # rows ist was dein row war
    name, telefonnummer, welpen_anzahl = row # Ein Weg die Daten zu entpacken.

for name, telefonnummer, welpen_anzahl in rows:  # direkt entpacken
    ...
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

naja, um ehrlich zu sein, das Feedback hier hat mich bis jetzt mehr verwirrt :)

Danke für deine Antwort, somit wäre nachfolgender Code vermutlich ganz OK.
Abgesehen davon, dass '+=' nicht verwendet wird und dass die variable k nicht sprechend benannt ist :)

Code: Alles auswählen

logger_ids = []
for k in logger_rows:
    logger_ids += [k[0]]
Das heißt aber auch, dass ich jeden Messwert ein zweites mal in der Hand nehmen muss, bevor damit gearbeitet werden kann. Einmal beim Runterladen von der Datenbank und einmal beim umformatieren.

und danke nochmal für die Nomenklatur:
* eine Tabelle = rows
* ein Zeile in einer Tabelle = row

Schönen Tag noch
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na du hast nicht dazu Stellung bezogen, was genau du da machen willst. Wenn es nur um *eine* Spalte geht, dann geht das - wie ja auch schon von Sirius3 gezeigt - auch so

Code: Alles auswählen

logger_ids = [id, for row in logger_rows]
Man beachte das Komma hinter ID. Das ist eine List-Comprehension, aber "effzienter" in Bezug auf die Ausfuehrung ist das nicht. Nur etwas kompakter. Wenn es dir darum geht, dann ist (gab's da nicht auch schon Hinweise zu?) pandas besser, weil das auf maximalen Komfort beim Zugriff geeicht ist.
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

ideal, danke nochmal.
ich wollte mich primär nur versichern, dass ich hier nicht auch etwas daher murkse, dass so nicht sein muss.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OWT: Wenn Du weisst, das man ``+=`` so nicht verwendet, warum tust Du es denn schon wieder? Die passende Methode für die nicht erst eine unnötige Liste erstellt werden muss, heisst `append()`.

Bei Pandas wären wir dann wieder bei SQLAlchemy. Oder SQLite, denn ausser für SQLite ist die Funktionsweise von `read_sql_query()` für nichts anderes garantiert. Da wird als zweites Argument ein „connectable“-Objekt von SQLAlchemy, eine Zeichenkette mit einer URL für SQLAlchemy, oder ein `sqlite3.Connection`-Objekt unterstützt. Alles andere kann in Flammen aufgehen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Tradition ist, wenn man etwas macht, aber nicht weiß warum :)
Antworten