如何让Slick 3产生BIGSERIAL而不是默认生成IDENTITY?

时间:2016-07-02 21:09:33

标签: postgresql slick scalatra slick-3.0

我使用PostgreSQL在Scalatra应用程序中启动并运行Slick 3。我能够从手动创建的表中读取就好了,但是我在通过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 个答案:

答案 0 :(得分:0)

和往常一样,我会在发布它的几分钟内回答我自己的StackOverflow问题。问题是我在我的数据访问对象中导入了一个已弃用的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 
  )