Frage

Ich habe ein Python-Modul erstellt, die erstellt und mehrere SQLite Tabellen auffüllt. Jetzt will ich es in einem Programm verwenden, aber ich weiß wirklich nicht, wie man es richtig nennen. Alle Tutorials, die ich gefunden habe, sind im Wesentlichen „inline“, das heißt, sie gehen durch SQLite in einer linearen Weise unter Verwendung anstatt, wie eigentlich verwenden es in der Produktion.

Was ich versuche, eine Methode Prüfung zu tun ist, zu sehen, ob die Datenbank bereits erstellt wird. Wenn ja, dann kann ich es verwenden. Wenn nicht, wird eine Ausnahme ausgelöst und das Programm wird die Datenbank erstellen. (Oder if / else-Anweisungen, je nachdem, welche ist besser).

Ich habe ein Testskript, um zu sehen, ob meine Logik korrekt ist, aber es funktioniert nicht. Wenn ich die try-Anweisung zu erstellen, es schafft nur eine neue Datenbank anstatt zu prüfen, wenn man bereits vorhanden ist. Das nächste Mal, wenn ich das Skript ausführen, bekomme ich einen Fehler, der die Tabelle bereits vorhanden ist, auch wenn ich die Ausnahme versucht zu kontrollieren. (Ich habe nicht verwendet try / except vor aber dachte, das ist eine gute Zeit zu lernen).

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

War es hilfreich?

Lösung

AFAIK eine SQLite-Datenbank ist nur eine Datei. Um zu überprüfen, ob die Datenbank vorhanden ist, überprüfen Sie für die Datei Existenz.

Wenn Sie eine SQLite-Datenbank öffnen eine automatisch erstellen, wenn die Datei, die es sichert nicht vorhanden ist.

Wenn Sie versuchen, eine Datei als sqlite3 Datenbank öffnen, die keine Datenbank ist, werden Sie diese:

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

so überprüfen, um zu sehen, ob die Datei vorhanden ist und auch sicherstellen, dass die Ausnahme für den Fall, um zu versuchen und fängt die Datei nicht eine sqlite3 Datenbank

Andere Tipps

Sie nicht diese komplexer machen, als es sein muss. Die großen, unabhängigen Datenbanken haben komplexe Einrichtungs- und Konfigurationsanforderungen. SQLite ist nur eine Datei, die Sie mit SQL zugreifen, ist es viel einfacher.

Sie wie folgt vor.

  1. eine Tabelle in Ihrer Datenbank für „Komponenten“ oder „Versionen“ oder „Konfiguration“ oder „Release“ oder etwas administrativer wie das Hinzufügen.

    CREATE TABLE REVISION (     RELEASE_NUMBER CHAR (20) );

  2. In Ihrer Anwendung verbindet normalerweise zu Ihrer Datenbank.

  3. Führen Sie eine einfache Abfrage der Revisionstabelle. Hier ist, was passieren kann.
    • Die Abfrage schlägt fehl auszuführen. Ihre Datenbank nicht vorhanden ist, führen Sie so eine Reihe von Anweisungen CREATE, um es zu bauen
    • Die Abfrage erfolgreich ist, gibt aber keine Zeilen oder die Versionsnummer ist niedriger als erwartet: Ihre Datenbank vorhanden ist, aber nicht mehr aktuell ist. Sie müssen aus dieser Veröffentlichung auf die aktuelle Version migrieren. Hoffentlich haben Sie eine Folge von DROP, CREATE und ALTER-Anweisungen, dies zu tun.
    • Die Abfrage erfolgreich ist, und die Release-Nummer ist der Erwartungswert. Tun Sie nichts mehr, Ihre Datenbank richtig konfiguriert ist.

SQLite erstellt automatisch die Datenbank das erste Mal, wenn Sie es zu benutzen versuchen Datei. Die SQL-Anweisungen Tabellen für die Erstellung können IF NOT EXISTS verwenden, um die Befehle nur wirksam wird, wenn die Tabelle auf diese Weise nicht erstellt wurde, brauchen Sie nicht für die Datenbank, die Existenz vorher zu überprüfen. SQLite für Sie kümmern, dass

Die Hauptsache ich immer noch besorgt sein würde, ist, dass für jede Web-Transaktion CREATE TABLE IF EXISTS Ausführung (sagen wir) wäre ineffizient; können Sie vermeiden, dass das Programm halten, indem er eine (in-memory) Variable zu sagen, ob es die Datenbank heute geschaffen hat, so läuft das CREATE TABLE Skript einmal pro Lauf. Dies würde immer noch erlauben, für die Datenbank zu löschen und neu beginnen während des Debuggen.

Wie @diciu erwähnt, wird die Datenbankdatei von sqlite3.connect erstellt werden . Wenn Sie eine spezielle Maßnahmen ergreifen wollen, wenn die Datei nicht vorhanden ist, werden Sie explizit müssen prüfen, für existance:

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)
...
  • SQLite keine Ausnahme werfen, wenn Sie eine neue Datenbank mit dem gleichen Namen zu erstellen, wird es nur mit ihm verbinden. Da SQLite eine dateibasierte Datenbank ist, schlage ich Sie nur für die Existenz der Datei überprüfen.
  • über Ihr zweites Problem, zu überprüfen, ob eine Tabelle bereits erstellt wurde, nur die Ausnahme abfangen. Eine Ausnahme. „Sqlite3.OperationalError: Tabelle TEST ist bereits vorhanden“ wird ausgelöst, wenn die Tabelle bereits vorhanden
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

in der Gesamt SQL zu tun, ist schrecklich in jeder Sprache, die ich abgeholt habe. Sqlalchemy hat gezeigt, von ihnen am einfachsten zu verwenden, da eigentliche Abfrage und mit ihm zu begehen von Schwierigkeiten so sauber und nicht vorhanden ist.

Hier einige grundlegende Schritte auf tatsächlich sqlalchemy in Ihrer Anwendung verwenden, können besser Details aus der Dokumentation.

  • Tabellendefinitionen bieten und ORM-Mappings
  • erstellen
  • load database
  • fragen sie Tabellen aus den Definitionen zu erstellen (wird nicht so tun, wenn sie vorhanden sind)
  • Erstellen Sitzung Hersteller (optional)
  • Erstellen Sitzung

Nach einer Sitzung erstellt haben, können Sie begehen und Abfrage aus der Datenbank.

Sehen Sie diese Lösung bei Source, die in einer Tutorial Weise Ihre Frage behandelt, mit lehr Quellcode:

y_serial.py Modul :: Lager Python-Objekte mit SQLite

"Serialisierung + persistance :: in wenigen Zeilen Code, komprimieren und mit Anmerkungen versehen Python-Objekte in SQLite, dann sie durch Schlüsselwörter ohne SQL zeitlich später abrufen Am nützlichsten.‚Standard‘Modul für ein Datenbank-Schema-weniger Daten zu speichern, ".

http://yserial.sourceforge.net

Ja, ich war das Problem nuking aus. Alles, was ich tun musste, war für die Datei zu überprüfen und die IOError fangen, wenn sie nicht vorhanden.

Danke für all die anderen Antworten. Sie können in der Zukunft nützlich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top