我试图运行mongock来处理版本控制的DB迁移,但mongock基础设施出现了一个异常,还请注意,我没有使用spring boot,只有spring bean系统,我没有选择使用spring boot。。。
Pom和代码段:
<dependency>
<groupId>com.github.cloudyrock.mongock</groupId>
<artifactId>mongock-standalone</artifactId>
<version>4.1.19</version>
</dependency>
<dependency>
<groupId>com.github.cloudyrock.mongock</groupId>
<artifactId>mongodb-springdata-v2-driver</artifactId>
<version>4.1.19</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.2</version>
</dependency>
代码:
@Configuration
@Import({MongoSelectorContext.class})
public class MongockBeans {
private final MongoSelectorContext mongoSelectorContext;
public MongockBeans(MongoSelectorContext mongoSelectorContext) {
this.mongoSelectorContext = mongoSelectorContext;
}
@Bean
public void updateMongoTemplateSchema() {
MongoTemplate mongoTemplate = mongoSelectorContext.mongoTemplateProvider().getMongoTemplateByDatabaseAlias("test");
MongockStandalone.builder()
.setDriver(SpringDataMongo2Driver.withDefaultLock(mongoTemplate))
.addChangeLogClass(TestChangeLog.class)
.buildRunner().execute();
}
}
Mongo模板按其应有的方式提供,但我遇到了以下抛出的错误,错误是从mongock而不是从我的变更集抛出的,它甚至不执行我的变更集。任何帮助都会很感激
Exception in thread "main" java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongockBeans': Invocation of init method failed; nested exception is io.changock.migration.api.exception.ChangockException: Error in method[MongockV3LegacyMigrationChangeRunAlwaysLog.mongockSpringLegacyMigration] : Wrong parameter[MongockLegacyMigration] with name: legacy-migration
at com.citi.qi.core.platform.CorePlatformLauncher.start(CorePlatformLauncher.java:39)
at com.citi.quickinsight.evaluation.engine.EngineMain.main(EngineMain.java:35)
...
Caused by: io.changock.migration.api.exception.ChangockException: Error in method[MongockV3LegacyMigrationChangeRunAlwaysLog.mongockSpringLegacyMigration] : Wrong parameter[MongockLegacyMigration] with name: legacy-migration
at io.changock.runner.core.MigrationExecutor.processExceptionOnChangeSetExecution(MigrationExecutor.java:195)
at io.changock.runner.core.MigrationExecutor.processSingleChangeSet(MigrationExecutor.java:102)
at io.changock.runner.core.MigrationExecutor.lambda$processSingleChangeLog$2(MigrationExecutor.java:94)
at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
at io.changock.runner.core.MigrationExecutor.processSingleChangeLog(MigrationExecutor.java:94)
at io.changock.runner.core.MigrationExecutor.lambda$processAllChangeLogs$1(MigrationExecutor.java:88)
at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
at io.changock.runner.core.MigrationExecutor.processAllChangeLogs(MigrationExecutor.java:88)
at io.changock.runner.core.MigrationExecutor.lambda$executeMigration$0(MigrationExecutor.java:69)
at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
at io.changock.runner.core.MigrationExecutor.executeMigration(MigrationExecutor.java:69)
at io.changock.runner.core.ChangockBase.execute(ChangockBase.java:49)
at com.citi.quickinsight.MongockBeans.updateMongoTemplateSchema(MongockBeans.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
... 14 more
Caused by: io.changock.driver.api.common.DependencyInjectionException: Wrong parameter[MongockLegacyMigration] with name: legacy-migration
at io.changock.runner.core.MigrationExecutor.lambda$getParameter$4(MigrationExecutor.java:182)
at java.util.Optional.orElseThrow(Optional.java:290)
at io.changock.runner.core.MigrationExecutor.getParameter(MigrationExecutor.java:182)
at io.changock.runner.core.MigrationExecutor.executeChangeSetMethod(MigrationExecutor.java:171)
at io.changock.runner.core.MigrationExecutor.executeAndLogChangeSet(MigrationExecutor.java:127)
at io.changock.runner.core.MigrationExecutor.processSingleChangeSet(MigrationExecutor.java:100)
... 32 more
虽然之前的解决方法可行,但这是由于Mongock bug#268,该bug已在版本4.2.3中修复。贝塔。
实际问题是,当构建器中没有设置包时,反射库会得到一个空的包列表,而不是返回任何内容,它会返回类路径中的所有内容。
由于99%没有注释,它们将被忽略,但它会找到遗留迁移并运行它。
解决方案:如果包列表为空,请避免调用反射库
这需要更深入地研究,但我猜您正在开发环境中,您可以尝试这种变通方法,这只是暂时的,您可以继续工作。
private MongockLegacyMigration getLegacyMigration() {
MongockLegacyMigration mongockLegacyMigration = new MongockLegacyMigration();
mongockLegacyMigration.setCollectionName("no-existing-collection");
return mongockLegacyMigration;
}
@PostConstruct
public MongockStandalone.Runner updateMongoTemplateSchema(MongoTemplate mongoTemplate) {
return MongockStandalone.builder()
.setDriver(SpringDataMongo2Driver.withDefaultLock(mongoTemplate))
.addChangeLogClass(ClientInitializerChangeLog.class)
.setLegacyMigration(getLegacyMigration())
.buildRunner();
}
请注意,您提供的是一个不存在的legacyMigration。这不是正确的/最终的解决方案,但不会有什么坏处,因为您正在开发(我的假设),这允许您继续工作。
我正在运行一个Spring boot 2.4.3应用程序,我有一个支持事务的mongob 4集群(我使用run-rs在本地运行它)。我也在使用Spring data mongob。我正在尝试为db迁移集成mongock(最新版本-4.3.8),但我面临一个问题,我无法解决。正如我们所知,最新版本的mongock默认使用事务。我有以下更改集,它只是为我的一个实体创建了一个mongob集合。 运行应用
问题内容: 我在夹层中使用Django1.7。我创建了简单的配置文件(根据Mezzanine文档),存储在单独的应用程序“配置文件”中: 创建迁移会返回: 当我运行“迁移配置文件”时: 问题是,当我尝试打开与mezzanine.accounts相关的任何页面(例如更新帐户)时,它崩溃并显示: 我做错了什么? 问题答案: 在MySQL数据库中,从表中删除行。 删除迁移文件夹中的所有迁移文件。 重试并
我正在尝试使用Flyway运行数据库迁移脚本。我有两个SQL脚本和一个Java脚本正在尝试运行。当我跑步的时候/gradlew flywayMigrate或gradle flywayMigrate它只接受SQL脚本,而不接受Java脚本 我的项目设置如下: database_migrations 我尝试了多种解决方案来让java脚本运行,例如指定,但这只会导致此输出。我尝试过将其移动到其他包。我尝
运行php artisan migrate时,它会给出以下错误消息 1.PDOException::(“SQLSTATE[HY000][2002]连接被拒绝”)/Users/redblac/olivertes/vendor/laravel/framework/src/illusted/Database/Connectors/Connector.php:70 2 PDO::_构造(“mysql:ho
问题内容: 我正在尝试使用任何语法,但无法考虑如何正确编写此代码: 也尝试过 和双引号等。运行迁移时,总是得到以下信息: 语法错误或访问冲突:1064您的SQL语法有错误。检查 与您的MariaDB服务器版本相对应的手册以获取正确的语法,以在第1行的“用户”修改“年龄” DATETIME附近使用 是的,我已经检查过,MariaDB使用MySQL的语法(至少在这种情况下)。 问题答案: 使用反引号而