所以我刚刚开始使用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
那么,是否有一种方法可以解决这个问题,或者我是否试图让liquubase做一些它没有设计的事情?
您可以考虑在变更日志的顶部使用特定于您所部署的环境的属性,类似于以下答案所描述的内容:
使用不同的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>