Создание допустимого сценария SQL для создания базы данных SQL Server - PullRequest
2 голосов
/ 28 января 2011

Я работаю над тестированием приложения, которое использует базу данных SQL Server. В целях тестирования мне бы очень хотелось иметь возможность использовать базу данных в памяти, такую ​​как HSQL. На самом деле у меня запущены тесты, но у меня все еще остаётся одна болевая точка - мне сложно создать сценарий SQL, который я могу использовать для создания своей базы данных HSQL. Поскольку эта система все еще находится в разработке, изменения в базе данных могут происходить и происходят, поэтому я не хочу тратить все свое время на обновление сценариев SQL вручную.

В SQL Server Management Studio я могу создать сценарий для создания этой базы данных. Этот сценарий, однако, содержит много «вещей», специфичных для SQL Server. Поэтому я не могу просто перенести этот скрипт в HSQL и заставить его выполнить. Вместо этого мне нужно потратить много времени на то, чтобы не работать в HSQL.

Сотрудник предложил использовать PowerBuilder для генерации скрипта, и, хотя сгенерированный им скрипт был несколько чище, он все равно не работал бы как есть в HSQL.

Может ли кто-нибудь предложить метод (инструмент, процесс и т. Д.), Который я могу использовать, чтобы указать на базу данных SQL Server и сгенерировать себе сценарий, который будет создавать ту же самую базу данных на HSQL?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Предполагая, что вы используете Hibernate, вы можете настроить Hibernate в своем тестовом сценарии для создания таблиц при создании sessionFactory.

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
        <list>
            <value>...hbm file...</value>
            ...
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            ...
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>

Единственным недостатком этого подхода является то, что если ваши файлы HBM не имеют соответствующих настроек, как ваша физическая база данных SQL Server (например, вы опускаете определенные ограничения или столбцы в файлах HBM), то созданные таблицы в HSQL будет другим.

2 голосов
/ 31 января 2011

Так же, как продолжение ответа, данного limc, вот что я смог сделать.

Я использую Spring и Hibernate, поэтому я смог взять свой конфигурационный файл данных Spring и превратить его в следующее:

<bean id="sessionFactory" name="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
    <list>
    ...hbm files...
    </list>
</property>
<property name="hibernateProperties">
<props>
    <prop key="hibernate.dialect">${db.dialect}</prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.format_sql">true</prop>
    <prop key="hibernate.use_sql_comments">false</prop> 
    <prop key="hibernate.hbm2ddl.auto">${ddl.create}</prop>
</props>
</property>
</bean>

Имея это, я смог настроить конфигурацию propertyConfigurer, чтобы заполнить заполнители, которые выглядят так:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="propertyConfigurer" 
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:test-messages.properties</value>
        </property>
    </bean>

</beans>

У меня есть один из этих файлов для моего тестирования и еще один для моего производственного кода. Показанная выше версия является моей тестовой версией и ссылается на файл test-messages.properties, который выглядит следующим образом:

db.dialect=org.hibernate.dialect.HSQLDialect
ddl.create=create

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

Спасибо, лимк!

Кроме того, я вижу проблему, о которой упоминал Лимк. Эта система предназначена для развертывания для подключения к производственной базе данных SQL Server, которая не будет создаваться через hbm2ddl. Так что, если в моих файлах HBM есть ошибка, все мои тесты могут нормально работать, в то время как у меня могут возникнуть сбои в работе.

С одной стороны, я очень недоволен этим, но, с другой стороны, я могу фактически запускать тестовые случаи для БД полностью автономным способом. Как и в случае с этим решением, кто-то может вывести этот проект из-под контроля исходного кода и немедленно запустить тестовые примеры, не выполняя каких-либо настроек БД. Мне нравится это тоже. К сожалению, я еще не нашел действительно отличный способ получить оба.

0 голосов
/ 28 января 2011

Существуют инструменты для миграции базы данных между двигателями.Одним из таких инструментов, который может сделать эту работу, является http://liquibase.org/

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