Comment puis-je vérifier dans SQLite, si une table existe?
Comment puis-je, de manière fiable, vérifiez dans SQLite, que l'utilisateur table existe?
Je ne demande pas fiable façons, comme vérifier si un "select *" sur le tableau retourné une erreur ou pas (est-ce vraiment une bonne idée?).
La raison en est comme ceci:
Dans mon programme, j'ai besoin de créer, puis de renseigner les quelques tables si elles n'existent pas déjà.
Si elles existent déjà, j'ai besoin de mettre à jour des tables.
Dois-je prendre un autre chemin au lieu de signaler que les tableaux en question ont déjà été créés à - dire, par exemple, par la création d'/mettre/réglage d'un certain drapeau dans mon programme d'initialisation/paramètres du fichier sur le disque ou quelque chose?
Ou est-ce que mon approche de sens?
- SQLite va lever une exception si la table dans une de sélectionner n'existe pas. Il n'y a tout simplement pas besoin de plus de fantaisie de travail.
- il sera, mais il en sera de n'importe quel nombre d'autres choses. C'est un peu comme voir si cet arbre est vraiment là par la conduite de l'avant avec vos yeux fermés, vous découvrirez une façon ou de l'autre 🙂
- bel exemple, mais un peu effrayant, surtout si la voiture de ma voiture...
- Je ne sais pas ce qui est le sqlite convention, mais il est plus pythonic demander pardon que demander la permission. c'est à dire d'intercepter l'exception au lieu d'utiliser un conditionnel.
- Maintenant, la question n'implique pas de Python, mais en supposant qu'il l'a fait, l'erreur est un générique
sqlite3.OperationalError
, de sorte que vous avez à analyser le message d'erreur afin de vous assurez qu'il est par exemple "table TABLE_NAME existe déjà" message lorsque vous créez une table, et si non, sur-relancer l'erreur et je pense que il n'ya aucune garantie que le libellé de l'erreur ne change pas.
Vous devez vous connecter pour publier un commentaire.
J'ai manqué cette entrée de la FAQ.
De toute façon, pour référence future, la requête complète est:
Où
{table_name}
est le nom de la table à vérifier.Section Documentation de référence: La Base De Données De Format De Fichier. 2.6. De stockage De La Base de données SQL Schéma
Cursor
's méthode degetCount()
ne devriez jamais vraiment de retour -1 (plus probablement une exception sera levée sur ou avant que si quelque chose était faux).Si vous utilisez SQLite version 3.3+ vous permet de créer facilement un tableau avec:
De la même façon, vous pouvez supprimer une table seulement si il existe à l'aide de:
create table
déclaration est incomplète (il manque les colonnes de la table de spécification).Une variante serait d'utiliser SELECT COUNT(*) au lieu de SÉLECTIONNER un NOM, c'est à dire
Ce sera le retour de 0, si la table n'existe pas, 1 si elle l'est. Cela est probablement utile dans votre programmation, car un résultat numérique est plus rapide /plus facile à traiter. L'exemple suivant illustre la façon dont vous voulez faire cela dans Android à l'aide de SQLiteDatabase, Curseur, rawQuery avec des paramètres.
COUNT(*)
) est facile à traiter, il est encore plus facile de revenir à l'existence d'une ligne ou non, et s'il y a une rangée de là, alors il existe, si il n'y a pas de ligne ça ne marche pas. (Vous avez déjà vérification de l'échec dans la moveToFirst, de sorte que le travail pourrait être fait à ce point.)Vous pourriez essayer:
SQLiteReader reader = cmd.ExecuteReader();
et faire undt.Load(reader)
(oùdt
est unDataTable
). J'ai trouvé qu'il donne ceObject reference is not an instance of an object
exception sur le.Load()
si la table n'est pas trouvé. Au lieu de cela, utilisez unSQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
et neadapter.Fill(ds)
, oùds
est unDataSet
. Vous pouvez ensuite voir sids.Tables.Count > 0
etreturn ds.Tables[0];
si oui (ouelse return null
). Ensuite, vous pouvez vérifier queDataTable
pour êtrenull
, sidt.Rows != null
, et sidt.Rows.Count>0
Si vous obtenez une "table existe déjà erreur", de faire des changements dans la chaîne SQL comme ci-dessous:
De cette façon, vous pouvez éviter les exceptions.
SQLite noms de table sont insensibles à la casse, mais la comparaison est sensible à la casse par défaut. Pour faire ce travail correctement dans tous les cas, vous devez ajouter
COLLATE NOCASE
.Utilisation:
Si le tableau est vide, c'est
your_table_name
n'existe pas.Documentation:
Exemple de sortie:
Voir cette:
Si vous utilisez fmdb, je pense que vous pouvez juste importation FMDatabaseAdditions et l'utilisation de la fonction bool:
Le code suivant renvoie 1 si la table existe, ou 0 si la table n'existe pas.
Noter que pour vérifier si une table existe dans le TEMP de base de données, vous devez utiliser
sqlite_temp_master
au lieu desqlite_master
:Voici la fonction que j'ai utilisé:
Donné un SQLDatabase Objet = db
Utiliser ce code:
Si le tableau renvoyé compte est égal à 1, cela signifie que la table existe. Sinon, il n'existe pas.
Utilisation
à prévenir tous les enregistrements de la lecture.
Le moyen le plus fiable que j'ai trouvé dans C#, au droit maintenant, à l'aide de la dernière sqlite-net-pcl package nuget (1.5.231) qui utilise SQLite 3, est comme suit:
Remarque: Ce travail est maintenant sur mon Mac avec Python 3.7.1
table_name
n'est pas fourni de untrused source (comme la saisie de l'utilisateur), sinon il sera vulnérable à une injection SQL. Il est toujours préférable d'utiliser des paramètres au lieu de texte des techniques de manipulationÀ l'aide d'une simple requête SELECT est - à mon avis - tout à fait fiable. La plupart de tout ce qu'il peut consulter le tableau existence dans beaucoup de différents types de base de données (SQLite /MySQL).
Il de sens que si vous pouvez utiliser d'autres mécanismes fiables pour déterminer si la requête a réussi (par exemple, interroger une base de données via QSqlQuery dans Qt).
Vous pouvez écrire la requête suivante pour vérifier la table existence.
Ici "table_name" est le nom de votre table que vous avez créé. Par exemple
et vérifier
c++ fonction vérifie la db et toutes les bases de données attachées d'existence de table et (éventuellement) de la colonne.
C'est mon code pour SQLite Cordova:
Et l'autre:
Je pensais mettre mes 2 cents à cette discussion, même si c'est plutôt ancienne..
Cette requête renvoie scalaire 1 si la table existe et 0 sinon.
Table existe ou non dans la base de données de swift