为不存在的 table slick scala 创建一个 class Table(Slick 3.0.0,scala)
create a class Table for an inexisting table slick scala (Slick 3.0.0, scala)
假设我们有一个包含两个 table 的数据库:Coffee
和 Suppliers
并且我们有它们对应的案例 classes 和 table s,就像在文档中一样:
import scala.slick.driver.MySQLDriver.simple._
import scala.slick.lifted.{ProvenShape, ForeignKeyQuery}
// A Suppliers table with 6 columns: id, name, street, city, state, zip
class Suppliers(tag: Tag) extends Table[(Int, String, String, String, String, String)](tag, "SUPPLIERS") {
def id: Column[Int] = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column
def name: Column[String] = column[String]("SUP_NAME")
def street: Column[String] = column[String]("STREET")
def city: Column[String] = column[String]("CITY")
def state: Column[String] = column[String]("STATE")
def zip: Column[String] = column[String]("ZIP")
// Every table needs a * projection with the same type as the table's type parameter
def * : ProvenShape[(Int, String, String, String, String, String)] = (id, name, street, city, state, zip)
}
// A Coffees table with 5 columns: name, supplier id, price, sales, total
class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") {
def name: Column[String] = column[String]("COF_NAME", O.PrimaryKey)
def supID: Column[Int] = column[Int]("SUP_ID")
def price: Column[Double] = column[Double]("PRICE")
def sales: Column[Int] = column[Int]("SALES")
def total: Column[Int] = column[Int]("TOTAL")
def * : ProvenShape[(String, Int, Double, Int, Int)] = (name, supID, price, sales, total)
// A reified foreign key relation that can be navigated to create a join
def supplier: ForeignKeyQuery[Suppliers, (Int, String, String, String, String, String)] =
foreignKey("SUP_FK", supID, TableQuery[Suppliers])(_.id)
}
现在假设我们要进行连接:
val result = for {
c <- coffees
s <- suppliers if c.supID === s.id
} yield (c.name, s.name)
这里处理结果很复杂(如果我们有很多连接,它会更复杂)因为我们需要始终记住名称的顺序,知道什么是 _._1
或 _._2
参考...等
问题 1 有没有办法将结果的类型更改为包含所需列的新 class 的 table?
问题2这里有一个方法,但是我无法完成,我们构造一个案例class例如:
case class Joined(nameS: String,nameC: String)
然后我们构建相应的 table 我不知道如何
class Joineds extends Table[Joinedclass] {
//Todo
}
当我们写一个连接时,我们可以写类似的东西(这样我们就可以将结果转换为 Joined 类型):
val result = for {
c <- coffees
s <- suppliers if c.supID === s.id
} yield (c.name, s.name).as(Joinds)
谢谢。
你能这样定义它吗:
val result = for {
c <- coffees
s <- suppliers if c.supID === s.id
} yield Joined(c.name, s.name)
然后把它藏在方便的地方?
假设我们有一个包含两个 table 的数据库:Coffee
和 Suppliers
并且我们有它们对应的案例 classes 和 table s,就像在文档中一样:
import scala.slick.driver.MySQLDriver.simple._
import scala.slick.lifted.{ProvenShape, ForeignKeyQuery}
// A Suppliers table with 6 columns: id, name, street, city, state, zip
class Suppliers(tag: Tag) extends Table[(Int, String, String, String, String, String)](tag, "SUPPLIERS") {
def id: Column[Int] = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column
def name: Column[String] = column[String]("SUP_NAME")
def street: Column[String] = column[String]("STREET")
def city: Column[String] = column[String]("CITY")
def state: Column[String] = column[String]("STATE")
def zip: Column[String] = column[String]("ZIP")
// Every table needs a * projection with the same type as the table's type parameter
def * : ProvenShape[(Int, String, String, String, String, String)] = (id, name, street, city, state, zip)
}
// A Coffees table with 5 columns: name, supplier id, price, sales, total
class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") {
def name: Column[String] = column[String]("COF_NAME", O.PrimaryKey)
def supID: Column[Int] = column[Int]("SUP_ID")
def price: Column[Double] = column[Double]("PRICE")
def sales: Column[Int] = column[Int]("SALES")
def total: Column[Int] = column[Int]("TOTAL")
def * : ProvenShape[(String, Int, Double, Int, Int)] = (name, supID, price, sales, total)
// A reified foreign key relation that can be navigated to create a join
def supplier: ForeignKeyQuery[Suppliers, (Int, String, String, String, String, String)] =
foreignKey("SUP_FK", supID, TableQuery[Suppliers])(_.id)
}
现在假设我们要进行连接:
val result = for {
c <- coffees
s <- suppliers if c.supID === s.id
} yield (c.name, s.name)
这里处理结果很复杂(如果我们有很多连接,它会更复杂)因为我们需要始终记住名称的顺序,知道什么是 _._1
或 _._2
参考...等
问题 1 有没有办法将结果的类型更改为包含所需列的新 class 的 table?
问题2这里有一个方法,但是我无法完成,我们构造一个案例class例如:
case class Joined(nameS: String,nameC: String)
然后我们构建相应的 table 我不知道如何
class Joineds extends Table[Joinedclass] {
//Todo
}
当我们写一个连接时,我们可以写类似的东西(这样我们就可以将结果转换为 Joined 类型):
val result = for {
c <- coffees
s <- suppliers if c.supID === s.id
} yield (c.name, s.name).as(Joinds)
谢谢。
你能这样定义它吗:
val result = for {
c <- coffees
s <- suppliers if c.supID === s.id
} yield Joined(c.name, s.name)
然后把它藏在方便的地方?