【问题标题】:What's the recommended location for SQL (DDL) scripts?SQL (DDL) 脚本的推荐位置是什么?
【发布时间】:2011-12-02 22:25:11
【问题描述】:

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

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

请指教。

【问题讨论】:

    标签: sql maven


    【解决方案1】:

    我认为没有最佳实践。在我过去的项目中,我创建了一个单独的目录来存储此类 SQL 脚本。

    例如src/main/db

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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>
      

      【讨论】:

      • "...但请记住,它会被打包到您的最终 jar 中,因此这取决于您是否想在生产代码中显示它。"这就是我犹豫将其放入资源目录的确切原因。毕竟,我将“资源”解释为或多或少的 JSF2 资源目录,您可以从中拖动您的库(从网页引用),因此 SQL 脚本在这方面不太符合条件。
      • @Kawu 在这种情况下,最好将这些东西完全放在 Maven 项目目录之外——尽管我不会为了自己的方便而移动它们。
      • 完全同意。我们通常将它们保存在 src/main 下的单独文件夹中,因此它们永远不会被错误地包含在构建产品中。我喜欢你的过滤器想法@MaDa
      【解决方案4】:

      我会为此使用src/main/resources。也许在那里创建一个子文件夹。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-01
            • 1970-01-01
            • 2010-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多