mysql - 从 createView 标记中删除架构名称

标签 mysql view liquibase

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

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

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

因此,当我使用此更改日志创建 application_testing 数据库时,我收到错误

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

那么有没有办法解决这个问题,或者我是否试图让 Liquibase 做一些它不是设计用途的事情?

最佳答案

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

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"/>

然后你可以有像这样的changeSets:

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

关于mysql - 从 createView 标记中删除架构名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25509615/

相关文章:

spring-boot - Liquibase 正在尝试执行之前已经执行过的变更集,因此抛出该表已经存在的错误

php - 显示自定义 SQL 结果

mysql - 从表中选择行但尽可能检索覆盖

php - 在 php 和 mysql 中从数据库组织问题和答案

mysql - 创建 View 时出现语法错误

gradle - Liquibase Gradle插件->多个changelog文件

mysql - 将 MySQL 中的日期视为过去 12 个月的日期,而不管实际存储的年份

Android gridview保持选中项目

django - 在另一个应用程序 View 中导入 django 应用程序 View

java - azure-sql 中不允许使用 Hibernate 调用的 USE 语句,我该如何避免它?