SQL(DDL)脚本的推荐位置是什么?

时间:2011-10-07 11:01:34

标签: sql maven

the Maven standard directory structure中SQL,DDL,...脚本的推荐位置是什么?

我敢打赌,几乎每个网络项目都使用数据库和某种需要存储在某处的SQL脚本,那么保留这些文件的“最佳”位置可能是什么?

请告知。

6 个答案:

答案 0 :(得分:56)

我认为没有最好的做法。在我过去的项目中,我创建了一个单独的目录来存储这样的SQL脚本。

例如src/main/db

默认情况下它不会被打包到最终的JAR(在大多数情况下这是首选的方式),但它很方便让它在程序集中打包。您甚至可以通过添加相应的资源声明或使用maven build-helper插件将它们打包到主工件JAR中。

但是,一切都取决于您对此脚本的使用情况。我简单的“经验法则”是,只有当它们真的是应用程序加载的资源时,我才会考虑将它们放在resources/中。

答案 1 :(得分:25)

我认为这完全取决于处理这些脚本的时间和方式:

  1. 编译时间:这些是您的编译器/工具链消耗并产生工件的东西。关于此的maven指南非常明确,因此文件将属于src/main/中的某个位置,如src/main/sqlsrc/main/db。虽然我不会这样做,但我可以看到编译任务使用这些来修改你的数据库。我可以看到liquibase脚本在这里使用,然后通过maven任务执行。
  2. 运行时:这些由运行时环境使用,可以对其进行修改,也可以由它使用以生成结果。将它们放在src/main/resources中似乎是合理的,以便您的运行时进程可以使用它们根据您的需要更改您的数据库 - 例如,作为部署中的热修复处理的一部分,或者作为常规数据库的一部分即时版本化工作。再次,也许您使用您的应用程序运送liquibase,然后以这种方式进行就地DB更改...
  3. 设计时间:在我看来,这是最可能出现的情况。我应该在哪里存储我的DDL以便在VCS中正确跟踪它们,并且仍然保持我的maven兼容结构?对我来说,这是src/scripts/sqlsrc/scripts/db。这将它们作为"来源" maven范围内的文件,但在一个旨在以更特别的方式使用的地方。

答案 2 :(得分:4)

src/main/resources是一个不错的地方,但请记住它会被打包到你的最后一个jar中,所以这取决于你是否想要在你的生产代码中揭示它。

如果没有,您可以通过将maven-jar-plugin配置摘录添加到适当的pom.xml来过滤掉这个:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
         <excludes>src/main/resources/privateSubdir/**</excludes>
    </configuration>
</plugin>

答案 3 :(得分:1)

我会将src/main/resources用于此目的。也许在那里创建一个子文件夹。

答案 4 :(得分:0)

这在很大程度上取决于您的里程数,但首先将您的应用程序与底层数据库结构分开是一个好主意。因此,我建议您将所有与数据库相关的内容移动到单独的maven项目中。完成后,数据库脚本在/ src / main / scripts中有一个很好的插槽。

答案 5 :(得分:0)

我将应用程序划分为多个Eclipse项目,每个架构层一个。这包括数据库。本质上,我只是为该项目创建了一种新的打包类型“数据库”。我创建了一个src / main / sql文件夹,在该文件夹下,我放置了数据库模式(例如src / main / sql / security)而不是Java包。我想如果您使用目录,那将是首先是目录,然后是它们之下的架构。在每个架构文件夹中,我为每种类型的数据库对象(表,视图等)放置一个文件夹,以便最终得到例如src / main / sql / security / tables,然后放置所有表定义那里的那个模式的文件。我很高兴阅读有关以这种方式进行操作的任何意见。