2016-07-02 1 views
0

Je me lève avec Slick 3 dans une application Scalatra, avec PostgreSQL. Je suis capable de lire à partir d'une table créée manuellement très bien, mais j'ai du mal à en créer un via Slick. Quand j'imprimera le SQL généré, je vois ceci:Comment puis-je obtenir Slick 3 pour produire BIGSERIAL au lieu de GENERATED BY DEFAULT AS IDENTITY?

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

qui ne fonctionne pas, même entré manuellement dans psql, générant une erreur:

ERROR: syntax error at or near "GENERATED" 

En fin de compte ce que je pense que je dois :

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

Dans mon build.scala, j'ai ces dépendances:

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

application.conf a ceci:

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

Mon code de démarrage a ceci:

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 a:

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) 
} 

Et le contrôleur appelle avec succès cette fonction de createAllTables, sans les erreurs. Je n'ai pas confirmé l'erreur via les journaux PostgreSQL directement parce que j'ai quelques difficultés à configurer le conteneur Docker dans lequel il s'exécute, mais j'ai confirmé la possibilité d'interroger.

Que dois-je modifier?

Répondre

0

Et comme d'habitude, je réponds à ma propre question StackOverflow dans les minutes qui suivent sa publication. Le problème était que j'importais un JdbcDriver obsolète dans mon objet d'accès aux données, où l'action schema.create était en cours de préparation. Je devais remplacer:

import slick.driver.JdbcDriver.api._ 

avec ceci:

import slick.driver.PostgresDriver.api._ 

Et maintenant, il est quelque chose de PostgreSQL génération aime:

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