避免表初始化以在Squeryl / Activerecord中创建表

时间:2013-06-12 21:26:54

标签: scala activerecord playframework-2.0 squeryl

我已经在mySQL中定义了一个数据库模式,我希望在它上面使用ActiveRecord应用程序处理play-2。

然而,当我启动项目时,它给了我错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'user' already exists
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'user' already exists
and it is triggered by 
 org.squeryl.Schema.create(Schema.scala:181)
 models.Tables$.initialize(Tables.scala:7)

这就是它在我的Tables.scala

中的样子
object Tables extends ActiveRecordTables with PlaySupport {
    val users = table[User]
}

我的User.scala是:

case class User( 
    override val id: Long,  
    @Length(max=50) login: String
) extends ActiveRecord {
    lazy val role = belongsTo[Role]
}
object User extends ActiveRecordCompanion[User]

我试图在我的global.scala

中跳过这个
override def onStart(app: Application) {
    //Tables.initialize
} 

然而,它仍然给我同样的错误

无论如何,我可以绕过创建表部分吗?

非常感谢!

3 个答案:

答案 0 :(得分:0)

您的数据库中是否已有一个user表,其中包含不同的架构?

由于您使用的是PlaySupport特征,我猜您正在使用Scala ActiveRecord Play2.1插件。如该项目的wiki中所述,在conf / play.plugins中添加以下设置

9999:com.github.aselab.activerecord.ActiveRecordPlugin

ActiveRecordPlugin类在启动时初始化表。所以你不应该从你的Global onStart

那里做到这一点

答案 1 :(得分:0)

也许您自己使用MyDatabaseLibrary.create()之类的东西?

检查出来。您可以尝试在目录中搜索.create

的出现次数

答案 2 :(得分:0)

我通过在Tables.scala中注释掉一些表模式来解决这个问题。 我在Table对象中声明了多个表,其中一个表不存在于数据库中,例如:

object Tables extends ActiveRecordTables with PlaySupport {
  val users = Table[User]
  val role = Table[Role]
  val group = Table[Group] //not exist which cause the error!
}

如果数据库中不存在其中一个表,则框架将按对象中列出的顺序创建 ALL 表。
我确实尝试将不存在的记录安排到顶部,框架将创建表并且无法运行。但是,如果出现上面列出的情况,则会出错:表'user'已经声明,并且 NO 表将在数据库中创建。

将作为一个错误引发给Activerecord并查看是否有解决方案。