Jak niezawodnie sprawdzać w SQLite, czy istnieje konkretna tabela użytkowników?
Nie pytam o niewiarygodne sposoby, takie jak sprawdzenie, czy „select *” na stole zwróciło błąd, czy nie (czy to nawet dobry pomysł?).
Powód jest następujący:
W moim programie muszę utworzyć, a następnie wypełnić niektóre tabele, jeśli jeszcze nie istnieją.
Jeśli już istnieją, muszę zaktualizować niektóre tabele.
Czy zamiast tego powinienem wybrać inną ścieżkę, aby zasygnalizować, że tabele, o których mowa, zostały już utworzone - powiedzmy na przykład, tworząc / umieszczając / ustawiając określoną flagę w pliku inicjalizacji / ustawień mojego programu na dysku lub coś takiego?
Czy moje podejście ma sens?
sqlite3.OperationalError
, więc musisz przeanalizować komunikat o błędzie, aby upewnić się, że np. Komunikat „Tabela TABLE_NAME już istnieje” podczas tworzenia tabeli, a jeśli nie, popraw błąd i myślę, że nie ma gwarancji, że sformułowanie błędu się nie zmieni.Odpowiedzi:
Brakowało mi tego wpisu FAQ.
W każdym razie, do wglądu w przyszłości, pełne zapytanie to:
Gdzie
{table_name}
jest nazwa tabeli do sprawdzenia.Dokumentacja w celach informacyjnych: Format pliku bazy danych. 2.6 Przechowywanie schematu bazy danych SQL
źródło
Jeśli używasz SQLite w wersji 3.3+, możesz łatwo utworzyć tabelę za pomocą:
W ten sam sposób możesz usunąć tabelę, tylko jeśli istnieje, używając:
źródło
create table
instrukcja jest niekompletna (brakuje specyfikacji kolumn tabeli).Odmianą byłoby użycie SELECT COUNT (*) zamiast SELECT NAME, tj
Zwróci 0, jeśli tabela nie istnieje, 1 jeśli tak. Jest to prawdopodobnie przydatne w programowaniu, ponieważ wynik liczbowy jest szybszy / łatwiejszy do przetworzenia. Poniżej pokazano, jak można to zrobić w systemie Android za pomocą SQLiteDatabase, Cursor, rawQuery z parametrami.
źródło
COUNT(*)
) jest łatwa do przetworzenia, jeszcze łatwiej jest zwrócić istnienie wiersza lub nie; jeśli jest tam rząd, to istnieje, jeśli nie ma żadnego wiersza, to nie. (Już sprawdziłeś awarię w moveToFirst, więc praca zostałaby wykonana w tym momencie.)Możesz spróbować:
źródło
SQLiteReader reader = cmd.ExecuteReader();
i wykonaj adt.Load(reader)
(gdziedt
jest aDataTable
). Odkryłem, że daje toObject reference is not an instance of an object
wyjątek,.Load()
jeśli tabela nie zostanie znaleziona. Zamiast tego użyj aSQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
i doadapter.Fill(ds)
, gdzieds
jestDataSet
. Następnie możesz sprawdzić, czyds.Tables.Count > 0
ireturn ds.Tables[0];
jeśli tak (lubelse return null
). Następnie możesz to sprawdzićDataTable
za bycienull
, jeślidt.Rows != null
i jeślidt.Rows.Count>0
Posługiwać się:
Jeśli wynikowa tabela jest pusta, wówczas
your_table_name
nie istnieje.Dokumentacja:
Przykładowe dane wyjściowe:
źródło
Nazwy tabel SQLite nie rozróżniają wielkości liter, ale w porównaniu domyślnie rozróżniana jest wielkość liter. Aby to działało poprawnie we wszystkich przypadkach, musisz dodać
COLLATE NOCASE
.źródło
Jeśli pojawia się błąd „Tabela już istnieje”, wprowadź zmiany w łańcuchu SQL, jak poniżej:
W ten sposób możesz uniknąć wyjątków.
źródło
Zobacz to :
źródło
Jeśli używasz fmdb , myślę, że możesz po prostu zaimportować FMDatabaseAdditions i użyć funkcji bool:
źródło
Poniższy kod zwraca 1, jeśli tabela istnieje, lub 0, jeśli tabela nie istnieje.
źródło
Pamiętaj, że aby sprawdzić, czy tabela istnieje w bazie danych TEMP, musisz użyć
sqlite_temp_master
zamiastsqlite_master
:źródło
Oto funkcja, której użyłem:
Biorąc pod uwagę SQLDatabase Object = db
źródło
Użyj tego kodu:
Jeśli zwrócona liczba tablic jest równa 1, oznacza to, że tabela istnieje. W przeciwnym razie nie istnieje.
źródło
Uwaga: Działa to teraz na moim komputerze Mac z Python 3.7.1
źródło
table_name
nie jest dostarczany z nieprzetworzonego źródła (np. Danych wejściowych użytkownika), w przeciwnym razie będzie podatny na wstrzyknięcie SQL. Zawsze lepiej jest używać parametrów zamiast technik manipulacji tekstemPosługiwać się
aby zapobiec odczytaniu wszystkich rekordów.
źródło
Możesz napisać następujące zapytanie, aby sprawdzić istnienie tabeli.
Tutaj „nazwa_tabeli” to nazwa tabeli, którą utworzyłeś. Na przykład
i zaznacz
źródło
Najbardziej niezawodny sposób, jaki znalazłem w C #, teraz przy użyciu najnowszego pakietu nuget sqlite-net-pcl (1.5.231), który używa SQLite 3, jest następujący:
źródło
Korzystanie z prostego zapytania SELECT jest - moim zdaniem - dość niezawodne. Przede wszystkim może sprawdzić istnienie tabeli w wielu różnych typach baz danych (SQLite / MySQL).
Ma sens, gdy można użyć innego niezawodnego mechanizmu do ustalenia, czy zapytanie zakończyło się powodzeniem (na przykład zapytanie do bazy danych za pośrednictwem QSqlQuery w Qt ).
źródło
Funkcja c ++ sprawdza db i wszystkie dołączone bazy danych pod kątem istnienia tabeli i (opcjonalnie) kolumny.
Edycja: Niedawno odkryłem funkcję sqlite3_table_column_metadata. W związku z tym
źródło
Oto mój kod dla SQLite Cordova:
I kolejny:
źródło
Pomyślałem, że postawię moje 2 centy na tę dyskusję, nawet jeśli jest ona raczej stara. To zapytanie zwraca skalar 1, jeśli tabela istnieje, a 0 w przeciwnym razie.
źródło
Tabela istnieje szybko lub nie w bazie danych
źródło