SQLite "File is not a Database"

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Pyvin
User
Beiträge: 5
Registriert: Donnerstag 22. August 2019, 12:45

Hallo,

wenn DU: helfen willst, eine konstruktive Antwort geben kannst - freue ich mich sehr über deine Antwort
oder
wenn DU: nur klugsch****** möchtest, nur dran denkst wie du es machen würdes und überhaupt nicht konstruktiv bist - Lass es einfach

Pythonscript: (sollte es hier Fehler geben, bitte mit codebeispiel)


from tkinter import *
import sqlite3


def abruf():
conn = sqlite3.connect('LebensmittelDB.dll')
cursor = conn.cursor()
cursor.execute("SELECT * FROM zutaten")
conn.commit()
conn.close()


root = Tk()

w = Label(root)
b1 = Button(root, command=abruf)

w.pack()
b1.pack()

root.mainloop()


Die Datenbank:

CREATE TABLE rezept1(Name TEXT FOREIGN KEY(Name), Maß VARCHAR(10) FOREIGN KEY(Maß), Anzahl INTEGER);
INSERT INTO rezept1 VALUES (Burger, Stck, 1);
INSERT INTO rezept1 VALUES (Brötchen, Stck, 1);

CREATE TABLE rezept2(Name TEXT FOREIGN KEY(Name), Maß VARCHAR(10) FOREIGN KEY(Maß), Anzahl INTEGER);
INSERT INTO rezept2 VALUES (Mehl, g, 100);
INSERT INTO rezept2 VALUES (Wasser, ml, 100);
INSERT INTO rezept2 VALUES (Öl, EL, 3);

CREATE TABLE bestand(Name TEXT FOREIGN KEY(Name), Maß VARCHAR(10) FOREIGN KEY(Maß), B-Anzahl INTEGER);

CREATE TABLE zutaten(Name TEXT PRIMARY KEY, Maß VARCHAR(10) PRIMARY KEY);
INSERT INTO zutaten VALUES (Burger, Stck);
INSERT INTO zutaten VALUES (Brötchen, Stck);
INSERT INTO zutaten VALUES (Mehl, g);
INSERT INTO zutaten VALUES (Wasser, ml);
INSERT INTO zutaten VALUES (Öl, EL);

_______________________________________________________________________________________________________________________

Ich habe zu dem fehler auch ein wenig ausschau gehalten, deshalb habe ich es bereits mit folgenden versucht:

-DB umzuwandeln in .sql/.dll/.db - hilft aber alles nicht
-SQLite 3 Version ist aktuell


Ja und weiteres habe ich eig auch nicht gefunden, ich hoffe Ihr könnt mir helfen. Gerne auch mehrere Tipps falls es eine Sache nicht sein sollte.

Danke euch allen auch wenn es nicht direkt die Lösung bringt
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Bitte setz deinen Code in Code-Tags (die werden eingefügt, wenn man den </> Button im vollständigen Editor drückt.

Bitte poste die komplette Fehlermeldung inkl. Stackdtrace.

Was heißt denn "die Datenbank"? Hast du das da so als Text reingeschrieben?

.dll ist ein schlechter Name für die Datei, weil .dll für shared-libraries unter Windows stehen.


*-Importe macht man nicht, weil man sich damit unglaublich viele fremde Namen in seinen eigenen Namensraum holt.. Vor allem nicht bei tkinter. Kovention ist import tkinter as tk und dann ansprechen der Klassen/Funktionen etc. per tk.name
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pyvin: Es wurde ja an anderer Stelle schon mal gesagt das man keine Tabelle pro Rezept hat. Tabellen sind bei relationalen Datenbanken etwas festes. Die werden während der Laufzeit nicht mehr oder weniger und die Namen sind nicht variabel.

``FOREIGN KEY`` ist durch die Bank weg falsch verwendet.

Wenn man eine `zutaten`-Tabelle hat die Namen von Zutaten auf eine Masseinheit abbildet, dann braucht man die Masseinheit nicht in allen anderen Tabellen speichern. Wobei das aber nicht so günstig ist, denn es gibt ja Rezepte da braucht man einen Teelöffel Zucker, bei anderen Esslöffel, und bei wieder anderen gibt es eine Gramm-Angabe.

Beim Bestand frage ich mich auch wie Du damit umgehen willst wenn beispielsweise 1kg Mehl im Bestand ist, das Rezept aber 2 Esslöffel Mehl auflistet. Wie ziehst Du die vom Bestand ab?

Sonderzeichen sollte man nicht in SQL-Namen verwenden. Und auch alles klein schreiben, denn SQL unterscheidet nicht zwischen Klein- und Grossschreibung bei Bezeichnern. Wenn man sich an die Konventionen von Python hält, hat man es einfacher ein ORM wie SQLAlchemy zu verwenden, weil man die Namen dann nicht noch mal extra abbilden muss.

Tabellen haben auch eher Namen im Singular, denn bei der Definition wird ja *ein* Datensatz beschrieben. Das fällt einem spätestens auf wenn man Namen für Fremdschlüssel bildet, die ja in der Regel dem Muster `<tabellen_name>_id` folgen. Und wenn man das ganze mit einem ORM verbindet, die Parallele zwischen Tabellennamen und Klassennamen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du die Datenbank wirklich so anlegst hast du - mal abgesehen von völlig falschen Entwurf, wie von __blackjack__ schon ausgeführt - wird so nichts in die DB geschrieben, weil durchweg das `commit` fehlt.

Dafür ist das `conn.commit()` in `Abruf` überflüssig.

Wenn du die GUI noch ausbauen willst, dann wähl' unbedingt einen klassenbasierten Ansatz, weil der Spaghetticode Ansatz sehr schnell unpfleg- und unerweiterbar wird.

Was meinst du mit " -SQLite 3 Version ist aktuell " - Python bringt SQLite mit, dass muss auf dem System nicht nochmal extra installiert sein.

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

@noisefloor: Das gezeigte SQL ist syntaktisch falsch, das verarbeitet SQLite auch mit COMMIT nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten