Frage

SELECT * FROM a, b WHERE ...

MySQL erlaubt doppelte Spaltennamen in den Ergebnissen einer Abfrage. Im Terminal wird also keiner der Spaltennamen mit der obigen Abfrage vorangestellt.

Ich verwende jedoch MySQLDB in Python mit dem DictCursor. Die Ergebnisse sind eine Liste von Wörterbüchern, bei denen die Spaltennamen die Schlüssel sind. Manchmal präfixt der DICT Cursor den Spaltennamen automatisch mit dem Tabellennamen. Soweit ich das beurteilen kann, ist dies für die zweite von zwei mehrdeutigen Spaltennamen, jedoch nur, wenn der zweite Wert eindeutig ist. Wie auch immer, ich möchte den Cursor zwingen, alle Schlüssel mit dem Tabellennamen zu präfixen.

Von dem MySQLDB -Dokumente Auf der Funktion fetch.row () ...

Der zweite Parameter (wie) sagt ihm, wie die Zeile dargestellt werden soll. Standardmäßig ist es Null, was bedeutet, als Tupel zurückzukehren. Wie = 1 bedeutet es als Wörterbuch, wobei die Schlüssel die Spaltennamen oder Tabelle sind. Wie = 2 bedeutet das Gleiche wie wie = 1, außer dass die Schlüssel immer Tabelle sind. Dies dient zur Kompatibilität mit dem alten MySQLDB -Modul.

Es erscheint also machbar, aber ich benutze die Funktion fetch.row () direkt ... also ist die Frage, Wie kann ich dazu führen, dass der MySQLDB -DICT Cursor immer wie = 2 verwendet, wenn er Zeilen holt?

War es hilfreich?

Lösung

Ich bin kein großer Fan von Verwendung * in Fragen. Listen Sie Ihre Spalten auf und weisen Sie nach Bedarf Ihre eigenen Aliase zu. Wie Sie sehen werden, bin ich auch kein Fan von impliziten Anschlüssen.

SELECT a.col1 AS acol1,
       a.col2 AS acol2,
       b.col1 AS bcol1,
       b.col2 AS bcol2
    FROM a
        INNER JOIN b
            ON ...
    WHERE...

Andere Tipps

Bei einem Diktat (oder einer anderen Datenstruktur), die die Tabellen und Felder explizit aufzählt, ist das Erstellen der SQL nicht zu schwer:

import itertools as it

fields={'a':('col1','col2'),'b':('col1','col3')}

fields_sql=', '.join("{t}.{f} as '{t}.{f}'".format(f=f,t=t)
                     for t in fields for f in fields[t])
sql='''SELECT {f}
    FROM a
        JOIN b ON ...
    WHERE ...'''.format(f=fields_sql)
print(sql)

ergibt

SELECT a.col1 as 'a.col1', a.col2 as 'a.col2', b.col1 as 'b.col1', b.col3 as 'b.col3'
    FROM a
        JOIN b ON ...
    WHERE ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top