Scala Slick:在MultiDBCakee示例中,autoInc是如何工作的?

Scala Slick:在MultiDBCakee示例中,autoInc是如何工作的?,scala,slick,Scala,Slick,我正在努力了解Slick的工作原理以及如何使用它。。。查看他们在GitHub中的示例,我最终得到了以下代码片段: 我假设*方法返回表中的一行,而autoInc应该以某种方式提供自动递增实体id的功能。。。但老实说,我在理解这段代码时遇到了一些麻烦。返回的是指什么?autoInc返回什么 我看了那些精巧的文档,但找不到有用的信息。任何帮助都将不胜感激;-) 因为autoInc可能会让人困惑,我将为您提供一个工作示例(请注意,我的DB是PostgreSQL,因此我需要使用forInsert进行黑客攻

我正在努力了解Slick的工作原理以及如何使用它。。。查看他们在GitHub中的示例,我最终得到了以下代码片段:

我假设
*
方法返回表中的一行,而
autoInc
应该以某种方式提供自动递增实体id的功能。。。但老实说,我在理解这段代码时遇到了一些麻烦。返回的
是指什么?
autoInc
返回什么


我看了那些精巧的文档,但找不到有用的信息。任何帮助都将不胜感激;-)

因为
autoInc
可能会让人困惑,我将为您提供一个工作示例(请注意,我的DB是PostgreSQL,因此我需要使用
forInsert
进行黑客攻击,以便使PostgreSQL驱动程序增加auto inc值)

然后像这样使用它:

GeoLocations.forInsert.insert(GeoLocation(None, 22.23, 25.36, 22.22))
由于您为
id
传递了
None
,因此当Slick插入此新实体时,它将由PostgreSql驱动程序自动生成。 从我开始使用Slick到现在已经有几个星期了,我真的很推荐它

更新:如果不想将
用于插入
投影,另一种方法是以下方法-在我的例子中,实体是
地址

创建架构时为每个表创建序列:

session.withTransaction {
  DBSchema.tables.drop
  DBSchema.tables.create
  // Create schemas to generate ids too.
  Q.updateNA("create sequence address_seq")
}
定义一种使用序列生成ID的方法(我在
RichTable
类中定义了一次

  def getNextId(seqName: String) = Database { implicit db: Session =>
    Some((Q[Int] + "select nextval('" + seqName + "_seq') ").first)
  }
在映射器覆盖
插入
方法中,如下所示:

  def insert(model : Address) = Database { implicit db: Session =>
    *.insert(model.copy(id = getNextId(classOf[Address].getSimpleName())))
  }

现在,当你插入时,你可以传递
None
,这个方法会为你做得很好…

…如果我不想要一个自动递增的ID怎么办?例如,我可以通过散列电子邮件地址来生成一个实体ID…你的例子对auto inc和custom ID都有效吗?是的,而不是传递
None
geologications.forInsert.insert(geologication(一些(134),22.23,25.36,22.22))
当表格更大时可以做什么?可能是15-20列…forInsert的
forcode>方法变成了怪物!@alexBrand在Slick 2.x中,不再需要
forInsert
session.withTransaction {
  DBSchema.tables.drop
  DBSchema.tables.create
  // Create schemas to generate ids too.
  Q.updateNA("create sequence address_seq")
}
  def getNextId(seqName: String) = Database { implicit db: Session =>
    Some((Q[Int] + "select nextval('" + seqName + "_seq') ").first)
  }
  def insert(model : Address) = Database { implicit db: Session =>
    *.insert(model.copy(id = getNextId(classOf[Address].getSimpleName())))
  }