Ergebnis von MySQL-Abfrage mittels tuple aufbereiten/anpassen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

Hallo,

in nutze folgende Python-Funktion:

Code: Alles auswählen

import mysql.connector as mc

def get_data_for_grid(host, port, user, password, database, sql):
    connection = mc.connect(host = host,
        port = port,
        user = user,
        password = password,
        database = database)

    cursor = connection.cursor()
    cursor.execute(sql)

    resultraw = cursor.fetchall()
    result = [tuple(str(item) for item in t) for t in resultraw]
    cursor.close()
    connection.close()

    return result
result enthält dabei jedoch Einträge der Forme 'None' wenn Felder des Ergebnisses NULL sind.

Wie muss ich die Zeile:

Code: Alles auswählen

result = [tuple(str(item) for item in t) for t in resultraw]
ändern, damit statt 'None' ein Leerstring zurückgeliefert wird?


Anders gesagt, die Funktion liefert derzeitig z.B.:
('1', '123', 'Schmidt', '', 'None', 'None', 'None', 'None', 'Bahnstr. 05', '10117', 'Berlin', 'None', '123', 'None', 'Schmidt', '123', 'None', 'None', 'None', 'de', 'Freiberufler', 'None', '75834', '123', 'IT', '1*', 'None')

und ich hätte stattdessen gern:
('1', '123', 'Schmidt', '', '', '', '', '', 'Bahnstr. 05', '10117', 'Berlin', '', '123', '', 'Schmidt', '123', '', '', '', 'de', 'Freiberufler', '', '75834', '123', 'IT', '1*', '')



Gruß
Stephan
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Stephan_2021: Du musst halt für jeden Wert prüfen ob er `None` ist, mit ``is None`` und dementsprechend entweder in eine Zeichenkette wandeln, oder eine leere Zeichenkette verwenden. Beispielsweise mit einem bedingten Ausdruck:

Code: Alles auswählen

from contextlib import closing

from mysql.connector import connect


def get_data_for_grid(host, port, user, password, database, sql):
    with connect(
        host=host, port=port, user=user, password=password, database=database
    ) as connection:
        with connection.cursor() as cursor:
            cursor.execute(sql)
            return [
                tuple((str(item) if item is not None else "") for item in row)
                for row in cursor.fetchall()
            ]
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum willst Du alles als Strings haben? Es hat ja einen Sinn, dass da verschiedene Typen in der Datenbank stehen.
Für Entscheidungen gibt es if und auf None prüft man mit `is None`.
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

Warum willst Du alles als Strings haben?
Weil ich Python benutze um das Einfügen eines Resultsets in ein Grid auf einem Dialog von LibreOffice (http://www.openoffice.org/api/docs/comm ... le-ix.html) zu beschleunigen und ich in dieses Grid ohnehin nur Strings eintragen kann.

Ich bin offen für jede andere Lösung, nur meine Daten müssen sehr schnell von einer MySQL-DB in ein LO-Grid.


Gruß
Stephan
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

__blackjack__ hat geschrieben: Sonntag 25. Juli 2021, 16:11 @Stephan_2021: Du musst halt für jeden Wert prüfen ob er `None` ist, mit ``is None`` und dementsprechend entweder in eine Zeichenkette wandeln, oder eine leere Zeichenkette verwenden. Beispielsweise mit einem bedingten Ausdruck:

Code: Alles auswählen

from contextlib import closing

from mysql.connector import connect


def get_data_for_grid(host, port, user, password, database, sql):
    with connect(
        host=host, port=port, user=user, password=password, database=database
    ) as connection:
        with connection.cursor() as cursor:
            cursor.execute(sql)
            return [
                tuple((str(item) if item is not None else "") for item in row)
                for row in cursor.fetchall()
            ]
Danke, das funktioniert gut. Mich überrascht das diese Auswertung/Umwandlung kaum mehr Zeit benötigt als die ursprüngliche Version - Prima. Ich muss aber noch eingehender mit größeren Datenmengen testen.


Gruß
Stephan
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

Ich muss aber noch eingehender mit größeren Datenmengen testen.
auch mit größeren Datenmengen (5000 Datensätze mit je 27 Feldern) ist das angenehm schnell

Danke, nochmals.


Gruß
Stephan
Antworten