2012-01-02 6 views
3

J'ai déjà un certain projet simple avec un script de migration:Comment configurer Play! Framework pour travailler avec ScalaQuery et H2?

# --- !Ups 

create table user (
    name  varchar(255) not null primary key, 
    password varchar(255) not null 
); 

insert into user values ('demo', 'demo'); 
insert into user values ('kuki', 'pass'); 


# --- !Downs 

drop table if exists user; 

base de données que j'utilise en est H2 en mémoire:

db.default.driver=org.h2.Driver 
db.default.url=jdbc:h2:mem:play 

Je veux évidemment interroger des données. Lorsque j'utilise anorm tout fonctionne correctement:

case class User(name: String, password: String) 
object User { 

    val simple = { 
    get[String]("user.name") ~/ 
    get[String]("user.password") ^^ { 
     case name~password => User(name, password) 
    } 
    } 

    def findByName(name: String): Option[User] = { 
    DB.withConnection { implicit connection => 
    SQL("select * from user where name = {name}").on(
     'name -> name 
    ).as(User.simple ?) 
    } 
    } 
} 

malchanceux lorsque je tente de faire la même chose avec ScalaQuery:

object User extends Table[(String, String)]("user") { 

    lazy val database = Database.forDataSource(DB.getDataSource()) 

    def name = column[String]("name", O PrimaryKey, O NotNull) 
    def password = column[String]("password", O NotNull) 
    def * = name ~ password 

    def findByName(name: String) = database withSession { 
    implicit db: Session => 
     (for (u <- this if u.name === name) yield u.name ~ u.password).list 
    } 
} 

Je reçois toujours la même erreur:

[JdbcSQLException: Tablela "user" nie istnieje Table "user" not found; 
SQL statement: SELECT "t1"."name","t1"."password" FROM "user" "t1" WHERE ("t1"."name"='input_name') [42102-158]] 



Y at-il quelque chose que je fais mal? Je pense que je suis strictement guide à partir de là: https://github.com/playframework/Play20/wiki/ScalaDatabase

--------------------- EDIT ------------- ----------

Apparemment, il y a une sorte d'incompatibilité entre les évolutions de Play et ScalaQuery. Lorsque j'ai créé table à l'aide:

database withSession { 
    implicit db: Session => 
    User.ddl.create 
    User.insert("demo", "demo") 
} 

tout semble bien fonctionner. Peut-être plus tard, je vais créer une base de données MySQL simple et vérifier ce qui se passe réellement à l'intérieur.

--------------------- EDIT 2 ----------------------- Donc, je sais plus ou moins ce qui se passe (mais je ne sais pas pourquoi). Lorsque je crée une structure db avec des évolutions, le nom de la table et les noms des colonnes sont écrits avec toutes les majuscules.
Et comme je suis sur Linux, c'est important. Si je devais changer les noms de tables et de colonnes dans le code, alors tout fonctionnerait.

Je suis seulement curieux de savoir s'il s'agit d'un bug ou si c'est un moyen d'imposer un cas approprié sur les migrations?

+0

où mettez-vous votre script de migration? Je suppose que c'est un script d'évolution, n'est-ce pas? – mandubian

+0

Oui, c'est. Le chemin du fichier est db/evolutions/default/1.sql –

+0

Ce n'est pas une bonne idée de nommer un utilisateur de table. Trop de mise en œuvre dbs sql devient confus. – flurdy

Répondre

5

Très probablement, le problème est que le jeu! Cadre cite les noms d'identificateurs (noms de table, les noms de colonnes) dans la requête, de sorte que vous devez citer le nom de table dans l'instruction « create table » ainsi:

create table "user" (
    "name"  varchar(255) not null primary key, 
    "password" varchar(255) not null 
); 
+0

Vous avez tout à fait raison :) –

+1

+1 a finalement résolu mon problème. –

+1

Edit: J'ai posté ceci sur le groupe Scalaquery, mais pas de réponse. La solution la plus simple consiste à remplacer les identificateurs par UPPERCASE (noms de colonne et de table). Cela semble fonctionner –

Questions connexes