我有一个 lagom 应用程序,并使用 lagom jdbc 作为读取侧。 表已创建并工作正常。重新启动并已创建的具有多键索引的表后,我总是收到错误:
org.postgresql.util.PSQLException: ERROR: relation "article_number_fulfiller_idx" already exists
我的表如下所示:
class ArticleTable(tag: Tag) extends Table[ArticleTableData](tag,ArticleTable.TableName) {
def entityId = column[UUID](ArticleTable.ColEntityId,O.PrimaryKey)
def articleBaseNumber = column[String](ArticleTable.ColArticleBaseNumber)
def articleSpecificationNumber = column[Option[String]](ArticleTable.ColArticleSpecificationNumber)
def fulfillerVendorNumber = column[String](ArticleTable.ColFulfillerVendorNumber)
def fulfillerName = column[String](ArticleTable.ColFulfillerName)
def availability = column[String](ArticleTable.ColAvailability)
def completeArticleNumber = column[String]("complete_article_number")
def idxKey = index("article_number_fulfiller_idx",(completeArticleNumber,fulfillerVendorNumber),unique = true)
def * = (entityId,articleBaseNumber,articleSpecificationNumber,fulfillerVendorNumber,fulfillerName,availability,completeArticleNumber) <> ( (ArticleTableData.apply _).tupled, ArticleTableData.unapply )
}
我的构建处理程序在这里:
override def buildHandler(): ReadSideProcessor.ReadSideHandler[Article.Event] = readSide
.builder[Article.Event](ArticleTable.TableName+"_offset")
.setGlobalPrepare(table.schema.createIfNotExists)
.setEventHandler[ArticleCreated](insert)
.setEventHandler[DescriptionAdded](_ => DBIOAction.successful(Done) )
.setEventHandler[DescriptionRemoved](_ => DBIOAction.successful(Done) )
.build()
我更新了我的 sbt 以使用最新的: 取而代之的是这个
lagomScaladslPersistenceJdbc
我现在用这个
"com.lightbend.lagom" %% "lagom-scaladsl-persistence-jdbc" % "1.6.2",
"com.typesafe.slick" %% "slick" % "3.3.2"
例外只是我得到的例外之一。我为每个多键索引都有一个例外:(
Lagom 每次重新启动都会尝试创建新的表和索引。为避免出现这些错误,请不要强制创建索引和表,如果不存在,请使用 create。如果 slick 不允许这样做,请查看本机查询。
你对这个光滑的问题是正确的。
该页介绍了它对开发和测试环境非常有用。
在这种情况下,您可以尝试:
- @vladislav-基辅建议的"如果不存在则创建"查询,
- 某些数据库不支持此类查询 (SQL Server(,您可以使用适当的错误代码捕获异常
我不建议使用 globalPrepare(( 来创建表和索引。这种方法的主要困难是表格更改。在这种情况下,您需要考虑对数据库脚本进行版本控制(如果索引删除/添加或删除列,您将怎么做?