13 Stimmen

SQLite in einem Python-Programm verwenden

Ich habe ein Python-Modul erstellt, das mehrere SQLite-Tabellen erstellt und auffüllt. Nun möchte ich es in einem Programm verwenden, aber ich weiß nicht, wie ich es richtig aufrufen soll. Alle Tutorials, die ich gefunden habe, sind im Wesentlichen "inline", d.h. sie gehen linear durch die Verwendung von SQLite und nicht, wie man es tatsächlich in der Produktion verwendet.

Ich möchte mit einer Methode prüfen, ob die Datenbank bereits erstellt wurde. Wenn ja, dann kann ich sie verwenden. Wenn nicht, wird eine Ausnahme ausgelöst und das Programm wird die Datenbank erstellen. (Oder verwenden Sie if/else-Anweisungen, je nachdem, was besser ist).

Ich habe ein Testskript erstellt, um zu sehen, ob meine Logik korrekt ist, aber es funktioniert nicht. Wenn ich die Try-Anweisung erstelle, wird einfach eine neue Datenbank erstellt, anstatt zu prüfen, ob bereits eine existiert. Wenn ich das Skript das nächste Mal ausführe, erhalte ich die Fehlermeldung, dass die Tabelle bereits existiert, auch wenn ich versucht habe, die Ausnahme abzufangen. (Ich habe try/except noch nie verwendet, dachte aber, dass dies ein guter Zeitpunkt ist, um es zu lernen).

Gibt es irgendwelche guten Tutorials für die Verwendung von SQLite operativ oder irgendwelche Vorschläge, wie dies zu codieren? Ich habe durch die Pysqlite-Tutorial und andere, die ich gefunden, aber sie nicht diese Adresse.

2 Stimmen

Könnten Sie vielleicht das Skript von Ihnen, das nicht zu funktionieren scheint, veröffentlichen?

30voto

S.Lott Punkte 371691

Machen Sie die Sache nicht komplizierter, als sie sein muss. Die großen, unabhängigen Datenbanken haben komplexe Einrichtungs- und Konfigurationsanforderungen. SQLite ist nur eine Datei, auf die Sie mit SQL zugreifen, das ist viel einfacher.

Gehen Sie wie folgt vor.

  1. Fügen Sie in Ihrer Datenbank eine Tabelle für "Komponenten" oder "Versionen" oder "Konfiguration" oder "Release" oder etwas ähnlich Administratives hinzu.

    CREATE TABLE REVISION( RELEASE_NUMBER CHAR(20) );

  2. Stellen Sie in Ihrer Anwendung eine normale Verbindung zu Ihrer Datenbank her.

  3. Führen Sie eine einfache Abfrage in der Revisionstabelle aus. Das kann passieren.

    • Die Abfrage kann nicht ausgeführt werden: Ihre Datenbank existiert nicht, also führen Sie eine Reihe von CREATE-Anweisungen aus, um sie zu erstellen.
    • Die Abfrage ist erfolgreich, liefert aber keine Zeilen oder die Versionsnummer ist niedriger als erwartet: Ihre Datenbank existiert, ist aber veraltet. Sie müssen von dieser Version auf die aktuelle Version migrieren. Hoffentlich haben Sie eine Reihe von DROP-, CREATE- und ALTER-Anweisungen, um dies zu tun.
    • Die Abfrage ist erfolgreich, und die Versionsnummer entspricht dem erwarteten Wert. Tun Sie nichts weiter, Ihre Datenbank ist korrekt konfiguriert.

13voto

diciu Punkte 28693

AFAIK ist eine SQLITE-Datenbank nur eine Datei. Um zu prüfen, ob die Datenbank existiert, prüfen Sie, ob die Datei existiert.

Wenn Sie eine SQLITE-Datenbank öffnen, wird diese automatisch erstellt, wenn die Datei, die sie sichert, nicht vorhanden ist.

Wenn Sie versuchen, eine Datei als sqlite3-Datenbank zu öffnen, die KEINE Datenbank ist, erhalten Sie diese Meldung:

"sqlite3.DatabaseError: Datei ist verschlüsselt oder ist keine Datenbank"

Prüfen Sie also, ob die Datei vorhanden ist, und stellen Sie sicher, dass Sie die Ausnahme abfangen, falls die Datei keine sqlite3-Datenbank ist

7 Stimmen

Es besteht immer noch eine winzige Möglichkeit, dass die Datei keine richtige SQLite-Datenbank mit dem erwarteten Schema ist. Ich schlage vor, dass Sie zusätzlich zur Überprüfung der Existenz der Datei eine Abfrage durchführen.

0 Stimmen

Eine ziemlich große Möglichkeit, hätte ich gedacht Überprüfung auf Dateiexistenz != Datenbankexistenz.

7voto

pdc Punkte 2266

SQLite erstellt die Datenbankdatei automatisch, wenn Sie zum ersten Mal versuchen, sie zu benutzen. Die SQL-Anweisungen zum Erstellen von Tabellen können IF NOT EXISTS um die Befehle nur dann wirksam werden zu lassen, wenn die Tabelle noch nicht erstellt wurde. Auf diese Weise müssen Sie nicht vorher prüfen, ob die Datenbank existiert: SQLite kann das für Sie erledigen.

Das Wichtigste, worüber ich mir immer noch Sorgen machen würde, ist, dass die Ausführung CREATE TABLE IF EXISTS für jede Web-Transaktion (sagen wir) wäre ineffizient; Sie können dies vermeiden, indem Sie das Programm eine (speicherinterne) Variable behalten lassen, die angibt, ob es die Datenbank heute erstellt hat, so dass es die CREATE TABLE Skript einmal pro Lauf. Dies würde es Ihnen ermöglichen, die Datenbank zu löschen und während der Fehlersuche neu zu beginnen.

5voto

gimel Punkte 78080

Wie @diciu schon sagte, wird die Datenbankdatei von sqlite3.connect . Wenn Sie eine spezielle Aktion durchführen wollen, wenn die Datei nicht vorhanden ist, müssen Sie explizit auf das Vorhandensein prüfen:

import os
import sqlite3
if not os.path.exists(mydb_path):
    #create new DB, create table stocks
    con = sqlite3.connect(mydb_path)
    con.execute('''create table stocks
      (date text, trans text, symbol text, qty real, price real)''')
else:
    #use existing DB
    con = sqlite3.connect(mydb_path)
...

0 Stimmen

Vielleicht sollten Sie Folgendes tun os.path.isfile 代わりに os.path.exists gemäß stackoverflow.com/a/84173/198348

4voto

Mapad Punkte 8044
  • Sqlite löst keine Ausnahme aus, wenn Sie eine neue Datenbank mit demselben Namen anlegen, sondern stellt einfach eine Verbindung zu ihr her. Da Sqlite eine dateibasierte Datenbank ist, schlage ich vor, dass Sie einfach die Existenz der Datei überprüfen.
  • Zu Ihrem zweiten Problem: Um zu prüfen, ob eine Tabelle bereits erstellt wurde, fangen Sie einfach die Ausnahme ab. Eine Ausnahme "sqlite3.OperationalError: table TEST already exists" wird ausgelöst, wenn die Tabelle bereits existiert.

    import sqlite3 import os database_name = "newdb.db" if not os.path.isfile(database_name): print "the database already exist" db_connection = sqlite3.connect(database_name) db_cursor = db_connection.cursor() try: db_cursor.execute('CREATE TABLE TEST (a INTEGER);') except sqlite3.OperationalError, msg: print msg

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X