Seite 1 von 1

pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 10:28
von OWT
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

Re: pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 10:34
von __deets__
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
    ...

Re: pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 12:27
von OWT
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

Re: pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 13:01
von __deets__
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.

Re: pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 13:18
von OWT
ideal, danke nochmal.
ich wollte mich primär nur versichern, dass ich hier nicht auch etwas daher murkse, dass so nicht sein muss.

Re: pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 13:35
von __blackjack__
@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.

Re: pyodbc.Row umwandeln

Verfasst: Mittwoch 22. Juni 2022, 14:17
von OWT
Tradition ist, wenn man etwas macht, aber nicht weiß warum :)