Анализатор схемы MySQL в Java? - PullRequest
6 голосов
/ 25 мая 2010

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

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

Редактировать: Просто хочу не изобретать велосипед без необходимости

Ответы [ 3 ]

4 голосов
/ 25 мая 2010

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

Использую 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);
    }

}

}
2 голосов
/ 20 марта 2017

Возможно, вы захотите использовать код из проекта Alibaba Druid . Хотя этот проект спроектирован как сложная библиотека пула соединений, он поддерживает очень продвинутый синтаксический анализатор и AST для ANSI SQL и не-ANSI диалектов, таких как MySQL, Oracle, SQL Server и т. Д. Проект с открытым исходным кодом и имеет очень либеральная версия Apache License 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()
   }
}
1 голос
/ 25 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...