Table 使用 play-slick 1.0 在 play 2.4 中创建
Table creation in play 2.4 with play-slick 1.0
我启动了 play-slick 模块 运行 并且还在使用 evolution 以便在应用程序启动期间在数据库中创建所需的 tables。
要使进化工作,需要编写一个 1.sql
脚本,其中包含我要创建的 table 定义。目前它看起来像这样:
# --- !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 正常工作,它还需要知道我的 table 的定义。所以我有一个看起来像这样的 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)
}
}
我现在在两个不同的地方基本上有相同的table定义。一次在 1.sql
脚本中,一次在 UserDAO class.
中
我真的一点都不喜欢这个设计!在两个不同的地方使用相同的 table 定义似乎是不对的。
是否有某种方法可以从 UserDAO classes 中的 table 定义生成进化脚本?或者是否有一种完全不同的方法在启动期间生成 table 定义(也许只使用 slick)?我真的很想只使用漂亮的 table 定义并摆脱烦人的 SQL 脚本。
我正在使用 play-2.4
和 play-slick-1.0
非常感谢。
好问题 - 我和你在同一条船上!
我只需要 DAO 和这段代码:
TableQuery[UsersTable].schema.create
这将为您创建数据库 table。不需要 .sql
.
相应地,要掉落,使用.drop
代替.create
。
您还可以使用 reduceLeft
组合 table 创建多个 table。以下是我的做法:
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._
我启动了 play-slick 模块 运行 并且还在使用 evolution 以便在应用程序启动期间在数据库中创建所需的 tables。
要使进化工作,需要编写一个 1.sql
脚本,其中包含我要创建的 table 定义。目前它看起来像这样:
# --- !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 正常工作,它还需要知道我的 table 的定义。所以我有一个看起来像这样的 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)
}
}
我现在在两个不同的地方基本上有相同的table定义。一次在 1.sql
脚本中,一次在 UserDAO class.
我真的一点都不喜欢这个设计!在两个不同的地方使用相同的 table 定义似乎是不对的。
是否有某种方法可以从 UserDAO classes 中的 table 定义生成进化脚本?或者是否有一种完全不同的方法在启动期间生成 table 定义(也许只使用 slick)?我真的很想只使用漂亮的 table 定义并摆脱烦人的 SQL 脚本。
我正在使用 play-2.4
和 play-slick-1.0
非常感谢。
好问题 - 我和你在同一条船上!
我只需要 DAO 和这段代码:
TableQuery[UsersTable].schema.create
这将为您创建数据库 table。不需要 .sql
.
相应地,要掉落,使用.drop
代替.create
。
您还可以使用 reduceLeft
组合 table 创建多个 table。以下是我的做法:
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._