这个问题可能看起来很愚蠢,但我找不到任何有关如何在Play 2.0中回滚演变的说明.谷歌只发现一个页面,说明进化文件的"唐氏"部分用于那个,而这就是全部.任何指针或说明将不胜感激.
似乎每当我更改模型时,Play Framework都会要求我运行一个删除整个模式并重新创建它的脚本.显然这不适合生产,那么在生产中处理这个问题的正确方法是什么?
注意,我正在使用ebean和Postgres,并在heroku上托管.
java postgresql playframework playframework-2.0 playframework-evolutions
我想在每个测试文件的开头手动运行我的evolution脚本.我正在玩Play!2.4和Slick 3.
根据文档,走的路似乎是:
Evolutions.applyEvolutions(database)
Run Code Online (Sandbox Code Playgroud)
但我无法获得我的数据库实例.在导入文档 play.api.db.Databases以获取数据库实例但是如果我尝试导入它,我收到此错误:object Databases is not a member of package play.api.db
如何获取我的数据库实例才能运行evolution脚本?
编辑:如评论中所述,这里是给出错误的完整源代码:
import models._
import org.scalatest.concurrent.ScalaFutures._
import org.scalatest.time.{Seconds, Span}
import org.scalatestplus.play._
import play.api.db.evolutions.Evolutions
import play.api.db.Databases
class TestAddressModel extends PlaySpec with OneAppPerSuite {
lazy val appBuilder = new GuiceApplicationBuilder()
lazy val injector = appBuilder.injector()
lazy val dbConfProvider = injector.instanceOf[DatabaseConfigProvider]
def beforeAll() = {
//val database: Database = ???
//Evolutions.applyEvolutions(database)
}
"test" must {
"test" in { }
}
}
Run Code Online (Sandbox Code Playgroud) 使用Play Framework 2.1
我在我的演变中定义了以下SQL:
CREATE OR REPLACE FUNCTION idx(myArray anyarray, myElement anyelement) RETURNS int AS $$
SELECT i FROM (
SELECT generate_series(array_lower(myArray,1),array_upper(myArray,1))
) g(i)
WHERE myArray[i] = anyElement
LIMIT 1; $$ LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
当我执行演变时,我收到以下错误:
We got the following error: ERROR: unterminated dollar-quoted string at or near
"$$ SELECT i FROM ( SELECT generate_series(array_lower(myArray,1),
array_upper(myArray,1)) ) g(i) WHERE myArray[i] = anyElement LIMIT 1" Position:
87 [ERROR:0, SQLSTATE:42601], while trying to run this SQL script:
Run Code Online (Sandbox Code Playgroud)
我正在使用PostgreSQL驱动程序版本9.1-901.jdbc4.
我查看了postgres查询日志,发现Play正在尝试执行以下操作:
LOG: execute <unnamed>: insert …Run Code Online (Sandbox Code Playgroud) postgresql jdbc postgresql-9.2 playframework-2.1 playframework-evolutions
我有一个环境,我正在使用多个数据库(A和B),每个数据库都有不同的演变集,因此完全成功.但是,总是首先应用一组数据库演进,B数据库的所有演进都在A数据库的任何演进之前应用.
我们正在做一些重大的重组,这导致一些跨数据库查询将数据库B移到未来,但由于数据库B的演变首先运行,数据库A的更改尚未发生,并且演变失败.
有没有办法改变/优先考虑使用不同演变集在多个数据库之间应用数据库演变的顺序?
使用play框架运行测试时,我遇到了进化问题
测试看起来像这样:
class TestFooController extends PlaySpec with GuiceOneServerPerSuite {
"foo endpoint should store some data" in {
val wsClient = app.injector.instanceOf[WSClient]
val url = s"http://localhost:$port/foo"
val requestData = Json.obj("foo" -> "bar")
val response = await(wsClient.url(url).post(requestData))
response.status mustBe OK
}
}
Run Code Online (Sandbox Code Playgroud)
数据库配置如下所示:
slick.dbs.default.driver="slick.driver.H2Driver$"
slick.dbs.default.db.driver="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play"
Run Code Online (Sandbox Code Playgroud)
假设有一个创建表的进化脚本,foos这个脚本在开发模式下工作正常.
运行测试时,抛出以下错误:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[JdbcSQLException: Table "foos" not found;
foos无法找到该表,因此我假设尚未应用数据库演变.
然后我将数据库配置更改为在开发模式下使用的postgresql.
slick.dbs.default.driver = "slick.driver.PostgresDriver$"
slick.dbs.default.db.driver = "org.postgresql.Driver"
slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/foo-test"
slick.dbs.default.db.user = "user"
slick.dbs.default.db.password = "password"
Run Code Online (Sandbox Code Playgroud)
使用此配置,测试工作正常,数据存储在数据库中,因此数据库演进运行得很好. …
scala playframework playframework-evolutions play-slick playframework-2.6
我在Play Framework 2中有一个简单的模型,如果执行INSERT时没有提供,我想指定一个默认值插入指定的INT列.
模型:
@Entity
@Table(name = "DashboardOptions", schema = "dbo")
public class DashboardOptions extends Model implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
public Long id;
@Basic(optional = false)
@Column(name = "userId")
public Long userId;
@Column(name = "chartType")
public String chartType;
public String name;
public Integer size = 2;
Run Code Online (Sandbox Code Playgroud)
我希望默认情况下size填充列2,但是,如果我指定上面的默认值,我的数据库演变不会反映这一点:
create table dbo.DashboardOptions (
id numeric(19) identity(1,1) not null,
userId numeric(19) not null, …Run Code Online (Sandbox Code Playgroud) 我将Play项目从版本2.3.4迁移到2.4.2.这些项目使用JPA(Hibernate)和Evolutions.我有一个最初的Evolutions SQL脚本,它用一些示例数据填充数据库.此脚本现在不再起作用,因为Evolutions脚本现在在Hibernate生成表之前执行,这显然会导致错误.这是一个理想的行为吗?有没有办法改变执行顺序?
hibernate jpa playframework playframework-evolutions playframework-2.4
我们正在使用Play 2.7(Java)进行制作.我们有一组常见的Ebean模型(作为外部库/ jar),它们在不同的Play项目之间共享,但我们因Play Evolutions脚本而陷入困境.有没有什么方法可以从外部文件夹/ jar加载这些脚本(.sql文件)?有没有人试过这个?
已经尝试在线搜索解决方案但没有用.需要有Play游戏经验的人的帮助.还请建议是否有其他方法来解决问题.感谢您的帮助!
目前,该项目正在从这里运行这些迁移脚本:
--> project
--> app
--> conf
--> evolutions
--> default <-- from here
Run Code Online (Sandbox Code Playgroud)
我想从这里的某个地方加载这些脚本:
--> project
--> app
--> External Libraries
--> group.artifact.version.jar
--> models
--> default <-- from here
Run Code Online (Sandbox Code Playgroud) 所以,我正在尝试部署我非常简单的Play Framework 2.1.1应用程序,但每当我通过端口命令行传递标志并应用数据库演变时,它们都会被忽略.
例如:
sudo play start -Dhttp.port = 80 -DapplyEvolutions.default = true
使用此命令,服务器将无法启动.port和applyEvolutions = true标志都被完全忽略,它会抛出此错误:
[warn] play - 你的生产数据库[默认]需要进化![warn] play - 运行-DapplyEvolutions.default = true如果你想自动运行它们(小心)哎呀,无法启动服务器.@ 6elhl9mca:数据库'默认'需要进化!
我已经尝试了所有我能想到的无济于事的东西.在我的本地机器上使用Play Run工作正常,没有问题.服务器正在运行Ubuntu 12.04.所有正确的驱动程序和连接字符串都存在并经过测试,数据库正在运行,除了Play Framework之外,一切正常运行.
java playframework-2.0 playframework-2.1 playframework-evolutions
java ×4
postgresql ×2
scala ×2
ebean ×1
hibernate ×1
jdbc ×1
jpa ×1
play-slick ×1
revert ×1
slick-3.0 ×1