Comment puis-je vérifier de manière fiable dans SQLite si une table utilisateur particulière existe?
Je ne demande pas de moyens peu fiables comme vérifier si un "select *" sur la table a retourné une erreur ou non (est-ce même une bonne idée?).
La raison est la suivante:
Dans mon programme, je dois créer puis remplir certaines tables si elles n'existent pas déjà.
S'ils existent déjà, j'ai besoin de mettre à jour certaines tables.
Dois-je prendre un autre chemin à la place pour signaler que les tables en question ont déjà été créées - par exemple, en créant / plaçant / définissant un certain indicateur dans mon fichier d'initialisation / paramètres de programme sur le disque ou quelque chose?
Ou mon approche est-elle logique?
sqlite3.OperationalError
, vous devez donc analyser le message d'erreur afin de vous assurer que c'est par exemple le message "table TABLE_NAME existe déjà" lorsque vous créez une table, et sinon, relancez l'erreur et je pense qu'il n'y a aucune garantie que la formulation de l'erreur ne changera pas.Réponses:
J'ai raté cette entrée FAQ.
Quoi qu'il en soit, pour référence future, la requête complète est:
Où
{table_name}
est le nom de la table à vérifier.Section de documentation pour référence: Format de fichier de base de données. 2.6. Stockage du schéma de base de données SQL
la source
Si vous utilisez SQLite version 3.3+, vous pouvez facilement créer une table avec:
De la même manière, vous ne pouvez supprimer une table que si elle existe en utilisant:
la source
create table
instruction est incomplète (il manque la spécification des colonnes de table).Une variante consisterait à utiliser SELECT COUNT (*) au lieu de SELECT NAME, c'est-à-dire
Cela retournera 0, si la table n'existe pas, 1 si elle existe. Ceci est probablement utile dans votre programmation car un résultat numérique est plus rapide / plus facile à traiter. Ce qui suit illustre comment vous le feriez dans Android en utilisant SQLiteDatabase, Cursor, rawQuery avec des paramètres.
la source
COUNT(*)
) soit facile à traiter, il est encore plus facile de renvoyer l'existence d'une ligne ou non; s'il y a une ligne, alors elle existe, s'il n'y a pas de ligne, elle n'existe pas. (Vous vérifiez déjà l'échec de moveToFirst, donc le travail serait fait à ce moment-là.)Tu pourrais essayer:
la source
SQLiteReader reader = cmd.ExecuteReader();
et faites undt.Load(reader)
(oùdt
est aDataTable
). J'ai trouvé qu'il donne cetteObject reference is not an instance of an object
exception sur le.Load()
si la table n'est pas trouvée. Utilisez plutôt aSQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
et doadapter.Fill(ds)
, oùds
est aDataSet
. Vous pouvez alors voir sids.Tables.Count > 0
etreturn ds.Tables[0];
si oui (ouelse return null
). Ensuite, vous pouvez vérifier celaDataTable
pour êtrenull
, sidt.Rows != null
et sidt.Rows.Count>0
Utilisation:
Si la table résultante est vide, elle
your_table_name
n'existe pas.Documentation:
Exemple de sortie:
la source
Les noms de table SQLite ne respectent pas la casse, mais la comparaison est sensible à la casse par défaut. Pour que cela fonctionne correctement dans tous les cas, vous devez ajouter
COLLATE NOCASE
.la source
Si vous obtenez une erreur "la table existe déjà", apportez les modifications dans la chaîne SQL comme ci-dessous:
De cette façon, vous pouvez éviter les exceptions.
la source
Voir ceci :
la source
Si vous utilisez fmdb , je pense que vous pouvez simplement importer FMDatabaseAdditions et utiliser la fonction bool:
la source
Le code suivant renvoie 1 si la table existe ou 0 si la table n'existe pas.
la source
Notez que pour vérifier si une table existe dans la base de données TEMP, vous devez utiliser à la
sqlite_temp_master
place desqlite_master
:la source
Voici la fonction que j'ai utilisée:
Étant donné un objet SQLDatabase = db
la source
Utilisez ce code:
Si le nombre de tableaux retournés est égal à 1, cela signifie que la table existe. Sinon, il n'existe pas.
la source
Remarque: cela fonctionne maintenant sur mon Mac avec Python 3.7.1
la source
table_name
n'est pas fourni par une source non utilisée (comme les entrées utilisateur), sinon il sera vulnérable à l'injection SQL. Il est toujours préférable d'utiliser des paramètres plutôt que des techniques de manipulation de texteUtilisation
pour empêcher la lecture de tous les enregistrements.
la source
Vous pouvez écrire la requête suivante pour vérifier l'existence de la table.
Ici, 'table_name' est le nom de votre table que vous avez créé. Par exemple
et vérifie
la source
Le moyen le plus fiable que j'ai trouvé en C # en ce moment, en utilisant le dernier paquet nuget sqlite-net-pcl (1.5.231) qui utilise SQLite 3, est le suivant:
la source
L'utilisation d'une simple requête SELECT est - à mon avis - assez fiable. Surtout, il peut vérifier l'existence de la table dans de nombreux types de bases de données différents (SQLite / MySQL).
Il est logique lorsque vous pouvez utiliser un autre mécanisme fiable pour déterminer si la requête a réussi (par exemple, vous interrogez une base de données via QSqlQuery dans Qt ).
la source
La fonction c ++ vérifie la base de données et toutes les bases de données attachées pour l'existence de la table et (éventuellement) de la colonne.
Edit: récemment découvert la fonction sqlite3_table_column_metadata. Par conséquent
la source
Voici mon code pour SQLite Cordova:
Et l'autre:
la source
Je pensais que je mettrais mes 2 cents à cette discussion, même si elle est plutôt ancienne. Cette requête renvoie scalaire 1 si la table existe et 0 sinon.
la source
La table existe ou pas dans la base de données dans swift
la source