2010-05-25 9 views
5

Weiß jemand, ob es eine Java-Bibliothek zum Parsen eines MySQL-Schemas gibt? Im Code möchte ich in der Lage sein, die in einem Schema angegebenen Tabellen und Felder zu bestimmen. Oder muss ich mein eigenes schreiben?Ein MySQL-Schema-Parser in Java?

Danke Richard.

Edit: Ich will nur unnötig neu zu erfinden das Rad vermeiden :)

+0

Je nachdem, was Sie es brauchen für eine Art und Weise sein, kann es in ziemlich einfache Art und Weise zu tun. Was wird die Anwendung davon sein? Sonst werfen Sie einen Blick auf http://stackoverflow.com/questions/660609/sql-parser-library-for-java – bobah

+0

@bobah - ok ja http://stackoverflow.com/questions/660609/sql-parser- Bibliothek-für-Java hat die Antwort - jsqlparser. Danke, –

Antwort

2

Beantwortung meiner Frage:

Am jsqlparser mit http://jsqlparser.sourceforge.net/

Diese individuellen Aussagen analysiert, nicht mehr Anweisungen wie in einem Schema gefunden. Also spalte das Schema auf ';' Es mag auch nicht den '' 'Charakter, also müssen diese entfernt werden. Code zu Spaltennamen für eine bestimmte Tabelle zu erhalten:

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); 
    } 

} 

} 
1

Warum nicht einfach DatabaseMetaData verwenden, um die Tabellen und Spalten, um herauszufinden? Dies setzt voraus, dass das in SQL ausgedrückte Schema für die Datenbank ausgeführt wurde, mit der Sie verbunden sind, aber das ist keine schwierige Annahme.

MySQL kann die Daten möglicherweise einfach importieren, wenn Sie die Daten im CSV-Format haben. Ich würde tiefer in MySQL-Tools eintauchen, bevor ich Java-Code schreibe, um so etwas zu tun. Wenn das nicht funktioniert, würde ich ein ETL-Tool finden, das mir hilft. Java zu schreiben wäre meine letzte Lösung.

+0

Leider wird dieser Code (derzeit) ausgeführt, bevor die Datenbank erstellt wird. Allerdings könnte ich vielleicht die Reihenfolge der Dinge ändern, also danke für den Tipp –

+1

Sofern Ihr Java-Code die Datenbank erstellen muss (und es sollte nicht), glaube ich nicht, dass Sie die SQL DDL analysieren sollten. – duffymo

+0

nein, es erstellt nicht die db. Was es tut, ist das Erstellen einer Datei für den DB-Import mit den im Schema definierten Spalten, die Werte, die aus einer Quelldatendatei stammen, die diese Spalten enthält, sowie eine ganze Reihe anderer in nicht-statischer Reihenfolge. –

0

Möglicherweise möchten Sie Druid project mit Code von Alibaba zu betrachten. Obwohl dieses Projekt als eine ausgefeilte Pooling-Bibliothek für Verbindungen konzipiert ist, unterstützt dieses Projekt eine sehr fortgeschrittene parser and AST für ANSI SQL und Nicht-ANSI-Dialekte wie MySQL, Oracle, SQL Server usw. Das Projekt ist Open Source und trägt die sehr liberale Apache License Version 2.0.

Der Haupteingang in diesen Teil der Bibliothek ist SQLUtils.java. Sie können aus SQLUtils.parseStatements verwenden zurückgegebenen Werte eine typisierte Modell der Aussagen zuzugreifen:

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() 
    } 
}