2010-05-25 3 views
5

Кто-нибудь знает, есть ли Java-библиотека для разбора схемы MySQL? В коде я хочу иметь возможность определять таблицы и поля, указанные в схеме. Или мне нужно написать свое?Анализатор схемы MySQL в Java?

Спасибо, Ричард.

Edit: Просто хочу, чтобы избежать заново изобретать колесо излишне :)

+0

В зависимости от того, что вам это нужно для может быть способом сделать это в довольно простом способе. Итак, каково будет применение этого? В противном случае вы можете посмотреть http://stackoverflow.com/questions/660609/sql-parser-library-for-java – bobah

+0

@bobah - ok yes http://stackoverflow.com/questions/660609/sql-parser- В библиотеке для java есть ответ - jsqlparser. спасибо –

ответ

2

Отвечая на мой собственный вопрос:

Am используя jsqlparser http://jsqlparser.sourceforge.net/

Это разбирает отдельные заявления, а не несколько таких заявлений, как найти в схеме. Так разделите схему на ';'. Это также не нравится символ ``, поэтому их нужно удалить. Код, чтобы получить имена столбцов для конкретной таблицы:

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

Почему бы просто не использовать DatabaseMetaData, чтобы узнать таблицы и столбцы? Это предполагает, что схема, выраженная в SQL, была запущена в отношении базы данных, к которой вы подключены, но это непростое предположение для удовлетворения.

MySQL может иметь возможность просто импортировать данные, если у вас есть данные в формате CSV. Я бы углубился в инструменты MySQL, прежде чем писать код Java для выполнения такой задачи. Если это не сработает, я найду инструмент ETL, который поможет мне. Написание Java было бы моим решением последней инстанции.

+0

К сожалению, этот код (в настоящее время) выполняется до создания базы данных. Тем не менее, я мог бы изменить порядок вещей, поэтому спасибо за подсказку –

+1

Если ваш Java-код не должен создавать базу данных (а это не должно), я не верю, что вы должны разобрать SQL DDL. – duffymo

+0

нет, это не создает db. то, что он делает, это создать файл для импорта db с столбцами, определенными в схеме, значениями, взятыми из файла исходных данных, который содержит эти столбцы, плюс целая группа других в нестационарном порядке. –

0

Вы можете рассмотреть возможность использования кода из Алибэбы Druid project. Несмотря на то, что этот проект разработан как сложная библиотека объединения пулов, этот проект поддерживает очень продвинутый для ANSI SQL и не ANSI-диалектов, таких как MySQL, Oracle, SQL Server и т. Д. Проект является открытым исходным кодом и имеет очень либеральную версию Apache версии 2.0.

Основные пункты ввода в эту часть библиотеки: SQLUtils.java. Вы можете использовать значение, возвращенное из SQLUtils.parseStatements для доступа к модели набранной из утверждений:

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() 
    } 
} 
Смежные вопросы