Wie überprüfe ich in SQLite zuverlässig , ob eine bestimmte Benutzertabelle vorhanden ist?
Ich frage nicht nach unzuverlässigen Methoden wie der Überprüfung, ob ein "select *" in der Tabelle einen Fehler zurückgegeben hat oder nicht (ist dies überhaupt eine gute Idee?).
Der Grund ist wie folgt:
In meinem Programm muss ich einige Tabellen erstellen und dann füllen, wenn sie noch nicht vorhanden sind.
Wenn sie bereits vorhanden sind, muss ich einige Tabellen aktualisieren.
Sollte ich stattdessen einen anderen Weg einschlagen, um zu signalisieren, dass die betreffenden Tabellen bereits erstellt wurden - beispielsweise durch Erstellen / Setzen / Setzen eines bestimmten Flags in meiner Programminitialisierungs- / Einstellungsdatei auf der Festplatte oder so?
Oder macht mein Ansatz Sinn?
sqlite3.OperationalError
Sie müssen die Fehlermeldung analysieren, um sicherzustellen, dass es sich beim Erstellen beispielsweise um die Meldung "Tabelle TABLE_NAME ist bereits vorhanden" handelt eine Tabelle, und wenn nicht, erhöhen Sie den Fehler und ich denke, es gibt keine Garantie, dass sich die Formulierung des Fehlers nicht ändert.Antworten:
Ich habe diesen FAQ-Eintrag verpasst.
Zum späteren Nachschlagen lautet die vollständige Abfrage wie folgt:
Wo
{table_name}
ist der Name der zu überprüfenden Tabelle?Dokumentationsabschnitt als Referenz: Datenbankdateiformat. 2.6. Speicherung des SQL-Datenbankschemas
quelle
Wenn Sie SQLite Version 3.3+ verwenden, können Sie ganz einfach eine Tabelle erstellen mit:
Auf die gleiche Weise können Sie eine Tabelle nur entfernen, wenn sie vorhanden ist, indem Sie Folgendes verwenden:
quelle
create table
Anweisung unvollständig ist (die Tabellenspaltenspezifikation fehlt).Eine Variation wäre, SELECT COUNT (*) anstelle von SELECT NAME zu verwenden, d. H.
Dies gibt 0 zurück, wenn die Tabelle nicht vorhanden ist, 1, wenn dies der Fall ist. Dies ist wahrscheinlich bei Ihrer Programmierung hilfreich, da ein numerisches Ergebnis schneller / einfacher zu verarbeiten ist. Im Folgenden wird veranschaulicht, wie Sie dies in Android mithilfe von SQLiteDatabase, Cursor, rawQuery mit Parametern tun würden.
quelle
COUNT(*)
) einfach zu verarbeiten ist, ist es noch einfacher, die Existenz einer Zeile zurückzugeben oder nicht; Wenn es dort eine Zeile gibt, existiert sie, wenn es keine Zeile gibt, existiert sie nicht. (Sie überprüfen bereits in moveToFirst, ob ein Fehler aufgetreten ist, damit die Arbeit an diesem Punkt erledigt ist.)Du könntest es versuchen:
quelle
SQLiteReader reader = cmd.ExecuteReader();
und führen Sie a ausdt.Load(reader)
(wodt
ist aDataTable
). Ich habe festgestellt, dass es dieseObject reference is not an instance of an object
Ausnahme gibt,.Load()
wenn die Tabelle nicht gefunden wird. Verwenden Sie stattdessen aSQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
und doadapter.Fill(ds)
, wods
ist aDataSet
. Sie können dann sehen, obds.Tables.Count > 0
undreturn ds.Tables[0];
ob ja (oderelse return null
). Dann können Sie , dass der CheckDataTable
für seinnull
, wenndt.Rows != null
, und wenndt.Rows.Count>0
Verwenden:
Wenn die resultierende Tabelle leer
your_table_name
ist, existiert sie nicht.Dokumentation:
Beispielausgabe:
quelle
Bei SQLite-Tabellennamen wird die Groß- und Kleinschreibung nicht berücksichtigt, beim Vergleich wird jedoch standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Damit dies in allen Fällen ordnungsgemäß funktioniert, müssen Sie hinzufügen
COLLATE NOCASE
.quelle
Wenn der Fehler "Tabelle existiert bereits" angezeigt wird, nehmen Sie die folgenden Änderungen an der SQL-Zeichenfolge vor:
Auf diese Weise können Sie die Ausnahmen vermeiden.
quelle
Siehe dies :
quelle
Wenn Sie fmdb verwenden , können Sie einfach FMDatabaseAdditions importieren und die Bool-Funktion verwenden:
quelle
Der folgende Code gibt 1 zurück, wenn die Tabelle vorhanden ist, oder 0, wenn die Tabelle nicht vorhanden ist.
quelle
Beachten Sie, dass zu prüfen , ob eine Tabelle in der TEMP - Datenbank vorhanden ist , müssen Sie verwenden
sqlite_temp_master
stattsqlite_master
:quelle
Hier ist die Funktion, die ich verwendet habe:
Gegeben ein SQLDatabase-Objekt = db
quelle
Verwenden Sie diesen Code:
Wenn die Anzahl der zurückgegebenen Arrays gleich 1 ist, bedeutet dies, dass die Tabelle vorhanden ist. Sonst existiert es nicht.
quelle
Hinweis: Dies funktioniert jetzt auf meinem Mac mit Python 3.7.1
quelle
table_name
Stellen Sie sicher, dass es nicht aus einer nicht verwendeten Quelle stammt (wie Benutzereingaben), da es sonst für SQL-Injection anfällig ist. Es ist immer besser, Parameter anstelle von Textmanipulationstechniken zu verwendenVerwenden
um zu verhindern, dass alle Datensätze gelesen werden.
quelle
Sie können die folgende Abfrage schreiben, um die Tabellenexistenz zu überprüfen.
Hier ist 'Tabellenname' Ihr Tabellenname, den Sie erstellt haben. Zum Beispiel
und prüfe
quelle
Der zuverlässigste Weg, den ich derzeit in C # gefunden habe, mit dem neuesten sqlite-net-pcl-Nuget-Paket (1.5.231), das SQLite 3 verwendet, ist folgender:
quelle
Die Verwendung einer einfachen SELECT-Abfrage ist meiner Meinung nach ziemlich zuverlässig. Vor allem kann es das Vorhandensein von Tabellen in vielen verschiedenen Datenbanktypen (SQLite / MySQL) überprüfen.
Es ist sinnvoll, wenn Sie einen anderen zuverlässigen Mechanismus verwenden können, um festzustellen, ob die Abfrage erfolgreich war (z. B. wenn Sie eine Datenbank über QSqlQuery in abfragen) Qt ).
quelle
Die c ++ - Funktion überprüft die Datenbank und alle angehängten Datenbanken auf das Vorhandensein von Tabellen und (optional) Spalten.
Bearbeiten: Kürzlich wurde die Funktion sqlite3_table_column_metadata entdeckt. Daher
quelle
Dies ist mein Code für SQLite Cordova:
Und die andere:
quelle
Ich dachte, ich würde meine 2 Cent in diese Diskussion stecken, auch wenn es ziemlich alt ist. Diese Abfrage gibt Skalar 1 zurück, wenn die Tabelle existiert, und 0 ansonsten.
quelle
Tabelle existiert oder nicht in der Datenbank in Swift
quelle