如何让 Slick 3 生成 BIGSERIAL 而不是 GENERATED BY DEFAULT AS IDENTITY?
How can I get Slick 3 to produce BIGSERIAL instead of GENERATED BY DEFAULT AS IDENTITY?
我起床了 运行 Scalatra 应用程序中的 Slick 3,使用 PostgreSQL。我可以从手动创建的 table 中读取数据,但我无法通过 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 = ""
}
}
我的 bootstrap 代码是这样的:
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 容器时遇到了一些问题,但我已经确认了查询的能力。
我必须调整什么?
和往常一样,我会在发布后几分钟内回答我自己的 Whosebug 问题。问题是我在我的数据访问对象中导入了一个已弃用的 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
)
我起床了 运行 Scalatra 应用程序中的 Slick 3,使用 PostgreSQL。我可以从手动创建的 table 中读取数据,但我无法通过 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 = ""
}
}
我的 bootstrap 代码是这样的:
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 容器时遇到了一些问题,但我已经确认了查询的能力。
我必须调整什么?
和往常一样,我会在发布后几分钟内回答我自己的 Whosebug 问题。问题是我在我的数据访问对象中导入了一个已弃用的 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
)