"Falsches" Einlesen in die Datenbank...

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hi leudde,
ich habe ein problem beim einlesen einer excel-tabelle in sqlite3.
es geht dabei um die spalte 'junction', die ich als text makiert habe:

Excel-Tabelle:
id PRIMARY KEY AUTOINCREMENT junction TEXT
-----------------------------------------------------------------------------------------------------------
1 300
2 331.10
3 VF 9.4


Die spalte 'junction' wird in die datenbank wie folgt übernommen:

id junction
-----------------------------------------------------------------------------------------------------------
1 300.0 < -------------- FUCK :cry:
2 331.10
3 VF 9.4


Ich benutze den Code:

Code: Alles auswählen

    def db_insert_MAIN(self, table_name, column_names, result_data):
        with self.conn:
            questionmarks = []
            for _ in column_names:
                questionmarks.append(' ?')
            sql = "INSERT INTO " + table_name + " (" + ', '.join(column_names) + ") VALUES (" + ', '.join(
                questionmarks) + ")"

            for element in result_data:
                lister = []
                for count in range(len(element)):
                    lister.append(element[count])
                val = tuple(lister)
                self.cursor.execute(sql, val)
zum einsetzen in die datenbank,
mit sql = INSERT INTO Tabelle1 (id, junction) VALUES ( ?, ?)
und val = ('id','junction')

Es läuft alles sauber durch, aber ich hätte gern das "datenbank-ergebnis":


id junction
------------------------
1 300 < -------------- HURRA :lol:
2 331.10
3 VF 9.4


D.h. ich will es so, wie ich es in der excel habe.
Ist das möglich?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OS: Das Problem hat nichts mit dem gezeigten Code zu tun. Da steht schon in `result_data` eine Gleitkommazahl, da kann weder der gezeigte Code noch die Datenbank etwas dafür. Und das Dir die Nachkommastellen in Excel nicht angezeigt werden, liegt an der *Darstellung* nicht an den Daten, denn auch Excel speichert den Wert ganz offensichtlich als Zahl. Wenn Du das nicht möchtest, musst Du den Wert in der Zelle in Excel explizit als Text speichern.

Was Du da in der ``for element …``-Schleife veranstaltest ist alles total umständlich und total überflüssig. Du kopierst jeden Datensatz erst superumständlich und unpythonisch in eine Liste um und die dann in ein Tupel. In ein Tupel hätte man das auch ohne die Liste dazwischen umkopieren können, aber selbst das ist nicht nötig, weil `execute()` als zweites Argument auch eine Liste nehmen würde. Diese ganze ``for``-Schleife wäre mit `executemany()` nur *eine* Zeile.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

danke für den tipp mit der for-schleife.
im excel-dokument habe ich die ganze spalte als text gespeichert.
zellenwerte einzelnd zu speichern ist dann ja sehr umständlich..
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OS: Die beanstandete Zelle kann in der Excell-Tabelle kein Text sein wenn dort '300' steht, die aber als Zahl ausgelesen wird. Oder Du machst irgend etwas mit den Daten was wir nicht wissen. Es ist aber wahrscheinlich, dass das in Excel Zahlen sind, denn das macht ja bei Eingaben in der Regel ein kleines Ratespielchen was der Benutzer wohl gemeint haben könnte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

also in excel habe ich die spalte 'junction' jetzt als text makiert (, im python code ist das natürlich auch als junction TEXT gesetzt).
es bringt aber bisher nichts :roll:
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Frage ist nicht als was Du die Spalte ”markierst”, sondern als was die *Zelle* tatsächlich gespeichert wird. Jede Zelle kann ihren eigenen Typ haben.

Entweder musst Du dafür sorgen das die Daten in Excel richtig sind, oder sie nach dem einlesen in Python entsprechen nachbearbeiten.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten