Выполнить DDL из спящего - PullRequest
0 голосов
/ 11 июля 2010

Я знаю, что SchemaExport должен быть моим другом. Но я использую liquibase и хочу выполнить DDL - чисто SQL-операторы, сгенерированные из liquibase, чтобы воссоздать базу данных перед каждым методом тестирования.

Видите ли вы проблемы со следующим кодом? Интересно, что это кажется таким сложным ...

public static int executeScript(String sqlFileOnClasspath) {
    Session sess = getSessionFactory().openSession();
    Transaction ta = sess.beginTransaction();
    int sqlCmd = 0;

    try {
        BufferedReader bReader = new BufferedReader(new InputStreamReader(
                  Util.class.getResourceAsStream(sqlFileOnClasspath), "UTF-8"));
        String line;
        while ((line = bReader.readLine()) != null) {
            if (line.startsWith("--") || line.trim().isEmpty())
                continue;

            final String tmp = line;
            sess.doWork(new Work() {

                @Override
                public void execute(Connection connection) throws SQLException {
                    connection.createStatement().execute(tmp);
                }
            });
            sqlCmd++;
        }
    } catch (Exception ex) {
        log.error("Couldn't execute " + sqlFileOnClasspath, ex);
    } finally {
        ta.commit();
        sess.close();
    }

    return sqlCmd;
}

Кстати: для ликвазы вам понадобится:

    // remove all hibernate managed tables
    SchemaExport schemaTool = new SchemaExport(getConfiguration()); 
    schemaTool.drop(false, true);

    // DROP TABLE DATABASECHANGELOGLOCK;
    // DROP TABLE DATABASECHANGELOG;
    executeScript("/drop-none-hib.sql");

    // now execute the DDL statements from liquibase
    int sqlCmd = executeScript("/schema.sql");
    log.info("Executed " + sqlCmd + " sql commands");

Ответы [ 2 ]

1 голос
/ 11 июля 2010

Безопасность

Непосредственное выполнение неподготовленных операторов может привести к внедрению SQL.Однако вы, похоже, читаете операторы DDL из статического файла, так что это не должно быть проблемой, просто хотелось бы отметить, что.

Обработка исключений

Отсутствует полностьюнапример, правильное закрытие входных потоков, соединений и т. д. Кроме того, отсутствует подробная информация о том, какой из операторов не выполнен, если выбрасывается какой-либо из SQLExceptions.Переменная sqlCmd также подсчитывает ошибочные операторы, поэтому я сомневаюсь в полезности этого счетчика.

Синтаксический анализ SQL / DDL

Вы проверяете комментарии типа --, но не для /* */ комментариев.Это когда-нибудь тебя укусит.Кроме того, синтаксический анализатор предполагает оператор SQL на строку.Более длинные операторы могут быть многострочными и заканчиваться точкой с запятой, которые необходимо обрезать.Хотя вы не уверены в том, как liquibase генерирует операторы, так что это не может быть реальной проблемой.

Обработка транзакций

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

В противном случае, поскольку это для тестирования, я тоже выгляжу хорошо.

0 голосов
/ 11 июля 2010

Почему бы вам просто не использовать конфигурацию hbm2ddl.auto ?

Или использовать транзакционные тесты, которые возвращают базу данных в исходное состояние после каждого теста?

...