首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用play-slick 1.0在play 2.4中创建表

使用play-slick 1.0在play 2.4中创建表
EN

Stack Overflow用户
提问于 2015-06-19 15:02:03
回答 1查看 920关注 0票数 5

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

要使进化工作,需要编写一个1.sql脚本,其中包含我想要创建的表定义。现在看起来是这样的:

代码语言:javascript
复制
# --- !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对象,如下所示:

代码语言:javascript
复制
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

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 15:17:26

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

我只需要DAO和这个代码:

代码语言:javascript
复制
TableQuery[UsersTable].schema.create

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

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

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

代码语言:javascript
复制
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,如:

代码语言:javascript
复制
val profile = slick.driver.H2Driver
import profile.api._
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30941386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档