从createView标记中删除模式名称

时间:2014-08-26 15:26:33

标签: mysql views liquibase

所以我刚开始使用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做一些它没有设计的东西?

1 个答案:

答案 0 :(得分: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"/>

然后你就可以拥有这样的changeets:

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