【问题标题】:Table creation in play 2.4 with play-slick 1.0使用 play-slick 1.0 在 play 2.4 中创建表
【发布时间】:2015-09-05 15:04:36
【问题描述】:

我启动并运行了 play-slick 模块,并且还在使用 evolution 以便在应用程序启动期间在数据库中创建所需的表。

为了使进化工作,需要编写一个1.sql 脚本,其中包含我要创建的表定义。目前它看起来像这样:

# --- !Ups

CREATE TABLE Users (
  id UUID NOT NULL,
  email varchar(255) NOT NULL,
  password varchar(255) NOT NULL,
  firstname varchar(255),
  lastname varchar(255),
  username varchar(255),
  age varchar(255),
  PRIMARY KEY (id)
);

# --- !Downs

DROP TABLE Users;

到目前为止一切顺利,但要让 Slick 正常工作,它还需要知道我的表的定义。所以我有一个UserDAO 对象,看起来像这样:

class UserDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._

  private val Users = TableQuery[UsersTable]

  def all(): Future[Seq[User]] = db.run(Users.result)

  def insert(user: User): Future[User] = db.run(Users += user).map { _ => user }

  //Table definition
  private class UsersTable(tag:Tag) extends Table[User](tag,"users"){
    def id = column[UUID]("id", O.PrimaryKey)
    def email = column[String]("email")
    def password = column[String]("password")
    def firstname = column[Option[String]]("firstname")
    def lastname = column[Option[String]]("lastname")
    def username = column[Option[String]]("username")
    def age = column[Int]("age")

    def * = (id, email,password,firstname,lastname,username,age) <> ((User.apply _).tupled, User.unapply)
  }
}

我现在基本上在两个不同的地方都有相同的表定义。一次在 1.sql 脚本中,一次在 UserDAO 类中。

我真的一点都不喜欢这个设计!在两个不同的地方有相同的表定义似乎是不对的。

有没有办法从 UserDAO 类中的表定义生成进化脚本?或者是否有完全不同的方式在启动期间生成表定义(可能只使用 slick)?我真的很想只使用光滑的表定义并摆脱烦人的 SQL 脚本。

我正在使用play-2.4play-slick-1.0

非常感谢。

【问题讨论】:

    标签: scala playframework playframework-2.0 slick slick-2.0


    【解决方案1】:

    很好的问题 - 我和你在同一条船上!

    我只有 DAO 和这段代码:

    TableQuery[UsersTable].schema.create
    

    这将为您创建数据库表。不需要.sql

    相应地,要删除,请使用.drop 而不是.create

    您还可以使用reduceLeft 组合创建多个表的表。这是我的做法:

    lazy val allTables = Array(
      TableQuery[AcceptanceTable].schema,
      [... many more ...]
      TableQuery[UserTable].schema
    ).reduceLeft(_ ++ _)
    
    /** Create all tables in database */
    def create = {
      allTables.create
    }
    
    /** Delete all tables in database */
    def drop = {
      allTables.drop
    }
    

    在范围内需要驱动程序 API 的所有内容,例如:

    val profile = slick.driver.H2Driver
    import profile.api._
    

    【讨论】:

    • 你把TableQuery[UsersTable].schema.create 电话放在哪里了?
    • 非常重要的是在以下范围内完成:val profile = slick.driver.H2Driver import profile.api._
    • 没有使用 cmets 的换行符,但请查看更新答案的底部。
    • 是否可以作为进化使用?
    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多