Vérifiez si la table existe

J’ai une application de bureau avec une firebase database intégrée. Lorsque j’exécute mon programme, je dois vérifier qu’il existe une table spécifique ou la créer si ce n’est pas le cas.

Étant donné un object Connection nommé conn pour ma firebase database, comment pourrais-je vérifier cela?

Vous pouvez utiliser les métadonnées disponibles:

DatabaseMetaData meta = con.getMetaData(); ResultSet res = meta.getTables(null, null, "My_Table_Name", new Ssortingng[] {"TABLE"}); while (res.next()) { System.out.println( " "+res.getSsortingng("TABLE_CAT") + ", "+res.getSsortingng("TABLE_SCHEM") + ", "+res.getSsortingng("TABLE_NAME") + ", "+res.getSsortingng("TABLE_TYPE") + ", "+res.getSsortingng("REMARKS")); } 

Voir ici pour plus de détails. Notez également les mises en garde dans JavaDoc .

 DatabaseMetaData dbm = con.getMetaData(); // check if "employee" table is there ResultSet tables = dbm.getTables(null, null, "employee", null); if (tables.next()) { // Table exists } else { // Table does not exist } 

En ajoutant au post de Gaby, mon jdbc getTables () pour Oracle 10g nécessite que tous les plafonds fonctionnent:

"employee" -> "EMPLOYEE"

Sinon, j’aurais une exception:

java.sql.SqlExcepcion jeu de résultats épuisé

(même si “employé” est dans le schéma)

Je ne trouve en fait aucune des solutions présentées ici pour être complètement complète, donc je vais append le mien. Rien de nouveau ici. Vous pouvez l’assembler à partir des autres solutions présentées ainsi que divers commentaires.

Il y a au moins deux choses à vérifier:

  1. Assurez-vous de transmettre le nom de la table à la méthode getTables() plutôt que de transmettre une valeur nulle. Dans le premier cas, laissez le serveur de firebase database filtrer le résultat pour vous. Dans la seconde, vous demandez une liste de toutes les tables du serveur, puis filtrez la liste localement. Le premier est beaucoup plus rapide si vous recherchez uniquement une seule table.

  2. Assurez-vous de vérifier le nom de la table à partir du jeu de résultats avec une correspondance égale. La raison en est que getTables() effectue une correspondance de modèle sur la requête pour la table et que le caractère _ est un caractère générique dans SQL. Supposons que vous vérifiez l’existence d’une table nommée EMPLOYEE_SALARY . Vous obtiendrez alors un match sur EMPLOYEESSALARY qui n’est pas ce que vous voulez.

Ohh, et rappelez-vous de fermer ces jeux de résultats. Depuis Java 7, vous souhaitez utiliser une instruction try-with-resources pour cela.

Voici une solution complète:

 public static boolean tableExist(Connection conn, Ssortingng tableName) throws SQLException { boolean tExists = false; try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) { while (rs.next()) { Ssortingng tName = rs.getSsortingng("TABLE_NAME"); if (tName != null && tName.equals(tableName)) { tExists = true; break; } } } return tExists; } 

Vous voudrez peut-être examiner ce que vous passez en tant que paramètre types (4ème paramètre) sur votre appel getTables() . Normalement, je laisserais juste à null parce que vous ne voulez pas vous restreindre. Une vue est aussi bonne qu’une TABLE, non? De nos jours, de nombreuses bases de données vous permettent de vous mettre à jour via une vue, de sorte que vous ne pouvez pas vous limiter au seul type de table. YMMV.

  /** * Method that checks if all tables exist * If a table doesnt exist it creates the table */ public void checkTables() { try { startConn();// method that connects with mysql database Ssortingng useDatabase = "USE " + getDatabase() + ";"; stmt.executeUpdate(useDatabase); Ssortingng[] tables = {"Patients", "Procedures", "Payments", "Procedurables"};//thats table names that I need to create if not exists DatabaseMetaData metadata = conn.getMetaData(); for(int i=0; i< tables.length; i++) { ResultSet rs = metadata.getTables(null, null, tables[i], null); if(!rs.next()) { createTable(tables[i]); System.out.println("Table " + tables[i] + " created"); } } } catch(SQLException e) { System.out.println("checkTables() " + e.getMessage()); } closeConn();// Close connection with mysql database } 

Si vous utilisez jruby, voici un extrait de code qui renvoie un tableau de toutes les tables d’une firebase database.

 require "rubygems" require "jdbc/mysql" Jdbc::MySQL.load_driver require "java" def get_database_tables(connection, db_name) md = connection.get_meta_data rs = md.get_tables(db_name, nil, '%',["TABLE"]) tables = [] count = 0 while rs.next tables < < rs.get_string(3) end #while return tables end