如何让 Slick 3 生成 BIGSERIAL 而不是 GENERATED BY DEFAULT AS IDENTITY?

Posted

技术标签:

【中文标题】如何让 Slick 3 生成 BIGSERIAL 而不是 GENERATED BY DEFAULT AS IDENTITY?【英文标题】:How can I get Slick 3 to produce BIGSERIAL instead of GENERATED BY DEFAULT AS IDENTITY? 【发布时间】:2016-07-02 21:09:32 【问题描述】:

我在 Scalatra 应用程序中使用 Slick 3 和 PostgreSQL 启动并运行。我可以从手动创建的表中读取数据,但我无法通过 Slick 创建表。当我打印出生成的 SQL 时,我看到了:

CREATE TABLE "my_table"
  (
     "id"   INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,
     "text" VARCHAR(4096) NOT NULL
  );

那个不行,甚至手动输入psql,产生错误:

ERROR:  syntax error at or near "GENERATED"

最终这就是我认为我需要的:

CREATE TABLE "my_table"
  (
     "id"   BIGSERIAL PRIMARY KEY,
     "text" VARCHAR(4096) NOT NULL
  );

在我的 build.scala 中,我有这些依赖项:

"com.typesafe.slick" %% "slick" % "3.0.2",
"org.postgresql" % "postgresql" % "9.4-1201-jdbc41",
"com.zaxxer" % "HikariCP" % "2.4.5",

application.conf 有这个:

postgres 
  driver = "slick.driver.PostgresDriver$"
  db 
    url = "jdbc:postgresql://db/mydb"
    driver = org.postgresql.Driver
    connectionPool = HikariCP
    user = postgres
    password = ""
  

我的引导代码是这样的:

import slick.backend.DatabaseConfig, StaticDatabaseConfig
import slick.driver.JdbcProfile

@StaticDatabaseConfig("file:src/main/resources/application.conf#postgres")
class ScalatraBootstrap extends LifeCycle 
  val logger = LoggerFactory.getLogger(getClass)

  override def init(context: ServletContext) 
    val dbConfig = DatabaseConfig.forConfig[JdbcProfile]("postgres")
    MyDAO.db = dbConfig.db
    context.mount(new MyController, "/*")
  
  ...

MyDAO 有:

var db: Database = null

class MyTable(tag: Tag) extends Table[(Int, String)](tag, "my_table") 
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def text = column[String]("text", O.SqlType("varchar(4096)"))

  def * = (id, text)


val myTable = TableQuery[MyTable]

val createTable = myTable.schema.create

def createAllTables() = 
  createTable.statements.foreach(println)
  db.run(createTable)

控制器成功调用了 createAllTables 函数,没有出现错误。我没有直接通过 PostgreSQL 日志确认错误,因为我在配置它正在运行的 Docker 容器时遇到了一些问题,但我已经确认了查询的能力。

我必须调整什么?

【问题讨论】:

【参考方案1】:

和往常一样,我会在发布后的几分钟内回答我自己的 *** 问题。问题是我在我的数据访问对象中导入了一个已弃用的 JdbcDriver,其中正在准备 schema.create 操作。我不得不替换这个:

import slick.driver.JdbcDriver.api._

用这个:

import slick.driver.PostgresDriver.api._

现在它正在生成 PostgreSQL 喜欢的东西:

CREATE TABLE "my_table" 
  ( 
     "id"   SERIAL NOT NULL PRIMARY KEY, 
     "text" VARCHAR(4096) NOT NULL 
  )

【讨论】:

以上是关于如何让 Slick 3 生成 BIGSERIAL 而不是 GENERATED BY DEFAULT AS IDENTITY?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 slick 3.0 中将 Rep[T] 转换为 T?

Slick 3 - 如何在使用纯 SQL 插入时获得正确的(数据库)架构

如何在 Sequelize 中使用 Postgres 的 BIGSERIAL?

Slick.js+Animate.css 结合让网页炫动起来

Slick 3.1 - 从 DBIOAction 打印 SQL(插入语句)

Slick 3:如何丢弃和接收具有某些关系的集合