Un analyseur de schéma MySQL en Java?


Quelqu'un sait-il s'il existe une bibliothèque java pour analyser un schéma MySQL? Dans le code, je veux pouvoir déterminer les tables et les champs spécifiés dans un schéma. Ou aurai-je besoin d'écrire le mien?

Merci Richard.

Edit: Je veux juste éviter de réinventer la roue inutilement:)

Author: Richard H, 2010-05-25

3 answers

Répondre à ma propre question:

J'utilise jsqlparser http://jsqlparser.sourceforge.net/

Analyse les instructions individuelles, pas les instructions multiples telles que trouvées dans un schéma. Divisez donc le schéma sur';'. Il n'aime pas non plus le caractère"', donc ceux-ci doivent être supprimés. Code pour obtenir des noms de colonnes pour une table particulière:

public class BUDataColumnsFinder {

public static String[] readSql(String schema) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(schema)));
    String mysql = "";
    String line;
    while ((line = br.readLine()) != null) {
        mysql = mysql + line;
    }
    br.close();
    mysql = mysql.replaceAll("`", "");
    return mysql.split(";");
}

public static List<String> getColumnNames(String tableName, String schemaFile) throws JSQLParserException, IOException {

    CCJSqlParserManager pm = new CCJSqlParserManager();
    List<String> columnNames = new ArrayList<String>();

    String[] sqlStatements = readSql(schemaFile);

    for (String sqlStatement : sqlStatements) {

        Statement statement = pm.parse(new StringReader(sqlStatement));

        if (statement instanceof CreateTable) {

            CreateTable create = (CreateTable) statement;
            String name = create.getTable().getName();

            if (name.equalsIgnoreCase(tableName)) {
                List<ColumnDefinition> columns = create.getColumnDefinitions();
                for (ColumnDefinition def : columns) {
                    columnNames.add(def.getColumnName());
                }
                break;
            }
        }
    }

    return columnNames;
}


public static void main(String[] args) throws Exception {

    String schemaFile = "/home/john/config/bu-schema.sql";

    String tableName = "records";

    List<String> columnNames = BUDataColumnsFinder.getColumnNames(tableName, schemaFile);

    for (String name : columnNames) {
        System.out.println("name: " + name);
    }

}

}
 4
Author: Richard H, 2010-05-25 13:47:59

Vous pouvez envisager d'utiliser le code du projet Druide d'Alibaba. Bien que conçu comme une bibliothèque de mise en commun de connexions sophistiquée, ce projet prend en charge un analyseur très avancé et AST pour les dialectes ANSI SQL et non ANSI tels que MySQL, Oracle, SQL Server, etc. Le projet est open source et porte la très libérale licence Apache Version 2.0.

Les principaux points d'entrée dans cette partie de la bibliothèque sont SQLUtils.java . Vous pouvez utiliser des valeurs renvoyées par SQLUtils.parseStatements pour accéder à un modèle typé des instructions:

List<SQLStatement> statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
for (SQLStatement statement : statements) {
   if (statement instanceof MySqlCreateTableStatment) {
      MySqlCreateTableStatment createTable = (MySqlCreateTableStatment) statement;
      // Use methods like: createTable.getTableSource()
   }
}
 2
Author: btiernay, 2017-03-19 21:20:53

Pourquoi ne pas simplement utiliser DatabaseMetaData pour trouver les tables et les colonnes? Cela suppose que le schéma exprimé en SQL a été exécuté sur la base de données à laquelle vous êtes connecté, mais ce n'est pas une hypothèse difficile à satisfaire.

MySQL pourrait être en mesure d'importer simplement les données si vous avez les données au format CSV. Je creuserais plus profondément dans les outils MySQL avant d'écrire du code Java pour faire une telle chose. Si cela ne fonctionne pas, je trouverais un outil ETL pour m'aider. Écrire Java serait ma solution de dernière Resort.

 1
Author: duffymo, 2010-05-25 12:31:52