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