Wie kann ich ganz klar eine SQLite3-Datenbank, ohne das löschen der Datenbank-Datei?
Für unit-Tests Zwecke, die ich brauche, um komplett zurücksetzen/löschen SQLite3-Datenbanken. Alle Datenbanken werden im Speicher erstellt wurde, anstatt auf das Datei-system bei der Ausführung der test-suite, daher kann ich nicht alle Dateien löschen. Zusätzlich werden mehrere Instanzen einer Klasse verweist Sie auf die Datenbank gleichzeitig, so kann ich nicht erstellen Sie einfach eine neue Datenbank im Speicher und es einer Variablen zuweisen.
Aktuell mein workaround für das löschen einer Datenbank ist, Lesen Sie alle Tabellennamen aus sqlite_master
- and-drop. Dies ist nicht das gleiche wie komplett löschen der Datenbank, aber, da meta-Daten und andere Dinge, die ich nicht verstehe, wird Sie wohl auch bleiben.
Ist es eine saubere und einfache Art und Weise, wie eine einzelne Abfrage zu löschen SQLite3-Datenbank? Wenn nicht, was müsste getan werden, um eine vorhandene Datenbank, um es identisch zu einer komplett neuen Datenbank?
Falls es relevant ist, ich bin mit Ruby 2.0.0 mit sqlite3-ruby version 1.3.7 und SQLite3 version 3.8.2.
Sorry, ich bin nicht mit Java noch die Entwicklung für Android. Siehe mein edit.
InformationsquelleAutor Hubro | 2014-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfache und schnelle Art und Weise
Beim Einsatz von in-memory-Datenbank, die Schnellste und zuverlässigste Weg, zu schließen und neu zu etablieren sqlite-Verbindung. Es spült alle Daten in der Datenbank und auch pro-Verbindung-Einstellungen.
Wenn Sie wollen, um eine Art "reset" - Funktion, müssen Sie davon ausgehen, dass keine anderen threads unterbrochen werden können, dass die Funktion sonst keine Methode schlägt fehl. Deshalb auch haben Sie mehrere threads auf die Datenbank, die es braucht, um ein "stop the world" - mutex (oder so ähnlich), so dass der reset durchgeführt werden kann. Während Sie haben exklusiven Zugriff auf die Datenbank-Verbindung - warum nicht schließen und erneut öffnen?
Der harte Weg
Wenn es einige andere Einschränkungen, und Sie können nicht tun es so, wie oben, dann waren Sie schon ziemlich nah an eine umfassende Lösung. Wenn Sie Ihre Fäden nicht berühren pragmas explizit, dann nur "schema_version" pragma kann geändert werden still, aber wenn Ihr threads ändern kann, pragmas, gut, dann müssen Sie gehen Sie durch die Liste auf http://sqlite.org/pragma.html#toc und schreiben "reset" - Funktion, die jede und jeder pragma-Wert initial-Wert (Sie müssen Lesen Sie Standard-Werte am Anfang).
Beachten Sie, dass pragmas in SQLite können eingeteilt werden in 3 Gruppen:
Gruppe 1 sind beispielsweise page_size, page_count, encoding, etc. Diese sind definiert bei der Erstellung der Datenbank moment und usualle kann nicht später geändert werden, mit einigen Ausnahmen. Zum Beispiel page_size können geändert werden, bevor "VAKUUM", so die neue Seite, wird die Größe festgelegt und dann. Die page_count kann nicht verändert werden durch den Benutzer, aber es ändert sich automatisch, wenn Sie Daten (natürlich). Die Kodierung ist zum Zeitpunkt der Erstellung definiert und kann nicht später geändert werden.
Sie sollten nicht zurückgesetzt werden muss, pragmas von Gruppe 1.
Gruppe 2 sind beispielsweise cache_size, recursive_triggers, jurnal_mode, foreign_keys, busy_timeout, etc. Diese pragmas sind immer auf Standardeinstellungen bei der Eröffnung der neuen Verbindung zur Datenbank. Wenn Sie nicht trennen, Sie müssen setzen Sie diese auf die Standardwerte manuell.
Gruppe 3 sind zum Beispiel schema_version, user_version, vielleicht noch ein paar andere, die Sie brauchen, um es nachzuschlagen. Diese müssen auch manuell zurücksetzen. Wenn Sie trennen von in-memory-Datenbank, die Datenbank zerstört wird, so dann Sie nicht brauchen, um setzen Sie diese.
db.close()
eine Verbindung und die Wiederverbindung mit der gleichenDatabase
Instanz? Mein Problem ist, dass ich mehrere Verweise auf die Datenbank von verschiedenen Orten in meinem code.Nach sqlite-ruby.rubyforge.org/classes/SQLite/Database.html#M000066 die
open()
zurück neue Instanz, also leider Nein, Sie können nicht nurdb.close()
. Ich sehe 2 Möglichkeiten: 1) gehen mit "the hard way", oder 2) schreiben Sie sich eine einfache wrapper-Klasse, die die gleiche Schnittstelle haben (Instanz-Methoden) und stellen die eigentlichedb
Objekt im inneren, so, wenn Sie anrufenclose()
undopen()
es wird intern in der Nähe, und erstellen Sie die neue Instanz, sondern das äußere Objekt wird die gleiche bleiben.InformationsquelleAutor Googie
und
InformationsquelleAutor vlg789
Im Fall von sqlite3-ruby, siehe
test/test_backup.rb
für ein Beispiel.InformationsquelleAutor CL.