在使用
在 playframework 中运行测试时,我遇到了进化问题未知数据类型:"JSONB"
我的 H2DbConnector 如下所示:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import org.scalatest.{BeforeAndAfterAll, FunSuite} import play.api.db.DBApi import play.api.db.evolutions.Evolutions import play.api.inject.guice.GuiceApplicationBuilder trait H2DbConnector extends FunSuite WITH BeforeAndAfterAll { val appBuilder = NEW GuiceApplicationBuilder() .configure(configuration) val injector = appBuilder.injector lazy val databaseApi = injector.instanceOf[DBApi] override def beforeAll() = { Evolutions.applyEvolutions(databaseApi.database("default")) } override def afterAll() = { Evolutions.cleanupEvolutions(databaseApi.database("default")) } } |
在 application.test.conf
2 3 | slick.dbs.default.db.driver ="org.h2.Driver" slick.dbs.default.db.url ="jdbc:h2:mem:play;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=FALSE" |
我在 Evolutions 2.sql 文件中遇到了一个问题
当我运行 dao 测试时出现类似
的错误
2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ALTER TABLE"Messages" ADD COLUMN"metaJson" JSONB NULL [50004-194] [ERROR:50004, SQLSTATE:HY004] [info] OptoutsDaoTest *** ABORTED *** [info] play.api.db.evolutions.InconsistentDatabase: DATABASE 'default' IS IN an inconsistent state![An evolution has NOT been applied properly. Please CHECK the problem AND resolve it manually BEFORE marking it AS resolved.] [info] at play.api.db.evolutions.DatabaseEvolutions.$anonfun$checkEvolutionsState$3(EvolutionsApi.scala:285) [info] at play.api.db.evolutions.DatabaseEvolutions.$anonfun$checkEvolutionsState$3$adapted(EvolutionsApi.scala:270) [info] at play.api.db.evolutions.DatabaseEvolutions.executeQuery(EvolutionsApi.scala:317) [info] at play.api.db.evolutions.DatabaseEvolutions.checkEvolutionsState(EvolutionsApi.scala:270) [info] at play.api.db.evolutions.DatabaseEvolutions.evolve(EvolutionsApi.scala:239) [info] at play.api.db.evolutions.Evolutions$.applyEvolutions(Evolutions.scala:193) [info] at H2DbConnector.beforeAll(H2DbConnector.scala:15) [info] at H2DbConnector.beforeAll$(H2DbConnector.scala:14) [info] at OptoutsDaoTest.beforeAll(OptoutsDaoTest.scala:5) [info] at org.scalatest.BeforeAndAfterAll.liftedTree1$1(BeforeAndAfterAll.scala:212) [info] ... |
您能帮我解决这个问题吗?
我最近在使用 JSONB 和 H2 时也遇到了这个问题。我通过创建 JSONB 到 JSON 的别名来解决它,并让它仅在 H2 上的测试配置文件期间运行。
这不是 JSONB,但 JSONB 与 JSON 的区别(至少在 postgres 中)本质上是读取性能,这对于测试目的并不重要(这么多)。
也许这个例子也有帮助:
这是一个使用flyway的例子。创建一个 sql 条目以在 /resources/db/tests 上为 jsonb 创建一个别名类型,该别名类型仅在测试配置文件上运行。
我们使用的是spring,所以这里是application.yml的入口:
2 3 4 5 6 7 8 9 | profiles: mytest datasource: continueOnError: FALSE url: jdbc:h2:mem:myapp-db;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE flyway: enabled: TRUE locations: classpath:db/migration, classpath:db/tests [......] |
这是 ${project.dir}/resources/db/
的列表

这就是魔法:
在文件的内容中,我创建了一个名为 JSONB 的类型,它基本上是 JSON 类型的别名。注意:据我所知,大写是必要的(特别是当您在创建表时引用它时)因为 H2 似乎自动将类型名称更改为 UPPERCASE:
下面是一个使用这种类型创建表的示例:
2 3 4 | id BIGSERIAL PRIMARY KEY, my_json_column_name JSONB NOT NULL ); |
在hibernate方面,我使用来自 hibernate-types52 的 JsonBinaryType 类型,在此链接上查看更多信息。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @TypeDef(name ="jsonb", typeClass = com.vladmihalcea.hibernate.type.json.JsonBinaryType.class) @Entity(name ="XXX") @TABLE(name ="XXX") public class XXX { @TYPE(TYPE ="jsonb") @COLUMN(name ="my_json_column_name", NULLABLE = FALSE) private String myJsonColumnName; //OR @TYPE(TYPE ="jsonb") @COLUMN(name ="my_json_column_name", NULLABLE = FALSE) private List<MYCustomTypeThatMatchesJsonObject> myJsonColumnName; } |
我希望它可以帮助某人。它对我有用。
于 2020 年 7 月 13 日更新
我停止在我的项目中使用 H2 并开始使用测试容器。非常容易设置,您可以在真实的数据库环境中进行测试。
H2 不支持
所有支持的列类型 H2 支持的数据类型
尝试在测试中也使用 postgres 或编写两个数据库都能理解的标准 SQL 语句。
当你连接到某个东西时,你不能使用 PostgreSQL 进行单元测试,单元测试应该只在内存测试中进行,因为它会被你的构建触发,而且构建服务器不太可能访问任何物理数据库,你可能需要另一种方法来模拟您的数据并避免从中访问数据库,或者将您的数据类型更改为 string[] 并将其封装以生成 JSON
对于那些在 H2 和 PostgreSQL 数据库中仍然存在这个问题的人,即使在定义了 TypeDef ...etc 之后,请在此处查看我的答案
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom
我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'