Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Scalatra/光滑,如果不存在,则插入_Database_Scala_Slick_Scalatra - Fatal编程技术网

Database Scalatra/光滑,如果不存在,则插入

Database Scalatra/光滑,如果不存在,则插入,database,scala,slick,scalatra,Database,Scala,Slick,Scalatra,我是个新手,希望能有点耐心。:) 如果值不存在,我将尝试填充两个表。基本上,我有: TABLE b ( id VARCHAR(254) PRIMARY KEY NOT NULL ); TABLE d ( id VARCHAR(254) PRIMARY KEY NOT NULL, relay INT NOT NULL, FOREIGN KEY ( relay ) REFERENCES b ( id ) ); 因此,我试图编写一个函数,用一个新值填充这两个表,如

我是个新手,希望能有点耐心。:)

如果值不存在,我将尝试填充两个表。基本上,我有:

TABLE b
(
    id VARCHAR(254) PRIMARY KEY NOT NULL
);


TABLE d
(
    id VARCHAR(254) PRIMARY KEY NOT NULL,
    relay INT NOT NULL,
    FOREIGN KEY ( relay ) REFERENCES b ( id )
);
因此,我试图编写一个函数,用一个新值填充这两个表,如果它不存在,或者忽略它,否则。。。当然,包装在事务中:

IF (NOT EXISTS(SELECT * FROM b where id='something'))
    insert into b values('something')
    insert into d values(1, 'something')
END
实现这种目标最有效的方法是什么?如果有必要的话,我会使用POstgreSQL 9.1,但我希望保持它的通用性

(编辑) 这些是我当前的表def(为了便于说明而简化):

在Slick 1.0.1中

db.withTransaction{ implicit session : Session =>
  if( ! Query(b).filter(_.id==="something").exists.run ){
    b.insert( "something" )
    d.insert( (1,"something") )
  }
}
在Slick 2.0中

val b = TableQuery[b]
db.withTransaction{ implicit session =>
  if( ! b.filter(_.id==="something").exists.run ){
    b += "something"
    d += (1,"something")
  }
}

谢谢确定事务是否因处理异常而失败的正确方法,或者是否存在内置的东西?顺便说一句,这帮助我找到了正确的方向(Slick 1.0.1),但我遇到了一个问题:“不明确的隐式值:类型=>scala.slick.session.session的对象数据库中类型为slick.driver.PostgresDriver.simple.session的值会话和类型为=>scala.slick.session.session的方法threadLocalSession都与预期类型scala.slick.session.session匹配,如果(!Query(b).filter(u.id==myval).exists.run)“关于含糊不清的含义,只需删除threadLocalSession导入。threadLocalSession只能在极少数情况下使用。事务失败是您自己做出的决定,或者是当withTransaction块中的代码未正常终止时(通过引发异常或根本不终止)隐式发生的决定。您通常希望捕获并处理withTransaction块之外的异常。我不确定,这是处理重复插入的最佳方法。我最近写了一篇关于它的文章。你应该读一读。
val b = TableQuery[b]
db.withTransaction{ implicit session =>
  if( ! b.filter(_.id==="something").exists.run ){
    b += "something"
    d += (1,"something")
  }
}