MySql Probleme beim fetch einer Zeile

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
swas
User
Beiträge: 2
Registriert: Samstag 5. Januar 2019, 18:33

Hallo Leute,

ich hab leider ein Problem mit Python3.6 und einer MySql Datenbank.
Ich habe mir einen Connector gebaut, der sich ohne Probleme mit der Datenbank verbindet, Insert, Updates und Select Statements abfeuert und die Verbindung sauber schließt. Das funktioniert auch alles ohne Probleme.
In einer Tabelle wird ein Numpy-Array als Text in die Spalte geschrieben (das ist eine Vorgabe). Das sieht dann z.b. so aus: [10 5 32 19]

Nun möchte ich das Array wieder aus der Tabelle lesen. Das Problem tritt aber beim fetchen der Zeile auf.
Folgendes passiert:
Ich bekomme eine ID für das Array und möchte es aus der Datenbank lesen. Dies mache ich wie folgt:

Code: Alles auswählen

con = ... # Verbindung aufbauen
cur = con.cursor()
cur.execute('SELECT myarray FROM table WHERE id = 1')
result = cur.fetchone()
print(result[0])
> [136 90 87 ... 66 96 125]
Das Array besteht aus vielen Zahlen und das Ergebnis wird in einer verkürzten Form gefetched. D.h. die drei Punkte '...' sind nicht etwa eine verkürzte Darstellung des print, sondern das result ist genau dieser String der ausgegeben wird. Mir fehlen also sehr viele Einträge in dem Array.

Ich habe schon viele verschiedene Möglichkeiten ausprobiert, den gesamten String, der auch komplett in der Datenbank eingetragen ist, zu erhalten. Leider ohne Erfolg. Scheinbar macht mir das WHERE irgendwie ein Problem, denn wenn ich keinen where Teil habe, bekomme ich auch das gesamte Array aus der Datenbank. Zum Beispiel:

Code: Alles auswählen

cur.execute('SELECT myarray FROM table')
result = cur.fetchone()
print(result[0])
> # Hier wird das gesamte Array ausgegeben. Ich erspar euch mal das gesamte Array.
Ich weiß jetzt leider überhaupt nicht wie ich den gesamten String mit einem SELECT aus der Datenbank holen kann.

Würde mich echt freuen wenn mir jemand sagen könnte, was ich falsch mache oder wie ich es schaffe den String zu erhalten.

Gruß,
swas
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das halte ich fuer eher unwahrscheinlich. Ich habe noch nie gesehen, das eine DB-Schnittstelle eine solche Verkuerzung vornehmen wuerde. Vor allem, weil sie auch niemals nicht wissen koennte, dass du da ein numpy-array hast, und das es aus numpy-sicht cooler ist, mittendrin ... einzufuegen, statt den Text ab einer bestimmten Laenge abzuschneiden, und dann am ENDE eine solche Ellipse einzufuegen.

Lass mich raten - wenn du das numpy-array *speicherst*, dann machst du einfach str(mein_array)? Denn DAS ist dein Problem. Die str-Repraesentation von numpy erzeugt keine vollstaendige Darstellung des Arrays.

Das die Vorgabe, arrays so in der Datenbank zu speichern ziemlicher Mist ist, und du die mal mit wem auch immer diskutieren solltest, ist noch eine kleine Zugabe. Wenn es schon in der DB sein *muss* (wuerde ich in Frage stellen, aber das bedarf mehr Informationen um das wirklich abschliessend zu diskutieren), dann waere zB ein pickle als BLOB deutlich besser. Das kann man dann naemlich auch gleich wieder einlesen, der Code zum parsen deiner Text-Spalte - den hast du ja noch gar nicht....
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

swas hat geschrieben: Samstag 5. Januar 2019, 18:55

Code: Alles auswählen

print(result[0])
> [136 90 87 ... 66 96 125]
Das Array besteht aus vielen Zahlen und das Ergebnis wird in einer verkürzten Form gefetched. D.h. die drei Punkte '...' sind nicht etwa eine verkürzte Darstellung des print, sondern das result ist genau dieser String der ausgegeben wird. Mir fehlen also sehr viele Einträge in dem Array.
Füge mal diese 2 Zeilen unter deinen Code und schau mal was da ausgegeben wird.

Code: Alles auswählen

for zahl in result[0]:
    print(zahl)
und dann erkennst du, dass es eine verkürzte Darstellung IST und dir keine Einträge fehlen.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@ThomasL: wer verkuerzt denn da? Ich denke mal eher, dass der TE bei dem WHERE eben ein Array erwischt, dass zu gross war, und ohne WHERE ein kleines, dass als ganzes dargestellt wurde:

Code: Alles auswählen

>>> import numpy as np
>>> np.zeros((100, 100))
array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]])
>>> np.zeros((3, 3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
Oder habe ich was uebersehen, und muss mit meiner harschen Kritik rasch zurueckrudern?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also nach nochmaliger Betrachtung gibt es natuerlich schon einen Unterschied - die numpy-Darstellung macht Kommas, im Post des TE sehe ich die nicht. Mir ist aber immer noch nicht klar, wer da die Punkte einfuegt. Die MySQL bestimmt nicht, und in Python habe ich das auch nicht gesehen bis dato.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ohne die Tabellendefinition zu kennen und dem Code, der die Einträge schreibt, läßt sich hier nur spekulieren.

@__deets__: das ist der Unterschied, zwischen repr und str:

Code: Alles auswählen

>>> str(np.eye(34))
'[[1. 0. 0. ... 0. 0. 0.]\n [0. 1. 0. ... 0. 0. 0.]\n [0. 0. 1. ... 0. 0. 0.]\n ...\n [0. 0. 0. ... 1. 0. 0.]\n [0. 0. 0. ... 0. 1. 0.]\n [0. 0. 0. ... 0. 0. 1.]]'
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok, aber das spricht dann ja letztendlich doch fuer meine Annahme - das der TE das Array ungeeignet ablegt.
swas
User
Beiträge: 2
Registriert: Samstag 5. Januar 2019, 18:33

Hallo Leute,

vielen Dank für eure Antworten. Ich bin das geschehen noch mal komplett durchgegangen.
Im Endeffekt habt ihr recht, dass das Format wohl total mist für das Array ist. Mir ist aufgefallen, dass nicht alle Arrays vollständig in die DB eingetragen werden. Verstehen tue ich es leider noch, da die Funktion (also das speichern in der DB) wohl bei manchen Einträgen sauber funktioniert und bei manchen nicht. Evtl. sind das auch irgendwelche Altlasten.

Ich werde jetzt einfach keinen Text mehr benutzen sondern Blobs. Das ist erstens sauberer und zweitens einfacher.

Danke für eure Hilfe!

Gruß,
swas
Antworten