【问题标题】:Remove schema name from createView tag从 createView 标记中删除模式名称
【发布时间】:2014-10-20 00:04:04
【问题描述】:

所以我刚刚开始使用 Liquibase,我正在尝试将它添加到已经有 200 多个表数据库设置的现有项目中。我已经成功创建了现有数据库的 changeLog.xml。

但是,我遇到了如何处理视图的问题。标记的内容包括完全限定的列名([schema].[table].[column])。这会产生一个问题,因为我希望能够使用 Liquibase 设置同一数据库的不同版本(开发、测试、生产),而这些数据库将具有不同的名称(例如 application_dev、application_testing、application_production)。如果我使用我的开发数据库创建 changeLog.xml,那么我将获得类似于以下视图的内容:

<createView replaceIfExists="true" viewName="view_clients">
  select `application_dev.clients.clientid','application_dev.clients.client_name' from `application_dev`
</createView>

所以当我去使用这个 changeLog 创建application_testing 数据库时,我得到了错误

Error executing SQL CREATE VIEW: Table `application_testing.clients` doesn't exist

那么有没有办法解决这个问题,还是我试图让 Liquibase 做一些它不适合做的事情?

【问题讨论】:

    标签: mysql views liquibase


    【解决方案1】:

    您可能会考虑在更改日志顶部使用特定于您要部署到的环境的属性,类似于此答案中描述的内容:

    Database Migration with Liquibase using different DBMS

    在您的情况下,与其使用值因 dbms 不同而不同的属性,不如使用其值因上下文而异的属性,这是专为此类问题设计的 Liquibase 概念。

    所以更改日志顶部的属性可能如下所示:

    <property name="schemaName" value="application_dev" context="dev"/>
    <property name="schemaName" value="application_test" context="test"/>
    <property name="schemaName" value="application_prod" context="production"/>
    

    然后你可以有这样的变更集:

    <createView replaceIfExists="true" viewName="view_clients">
      select `${schemaName}.clients.clientid','${schemaName}.clients.client_name' from `${schemaName}`
    </createView>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2014-01-06
      相关资源
      最近更新 更多