我真的在两个不同的堆栈之间撕裂,用于构建一个大型应用程序.一方面有这个选项:
node.js路径对我很有吸引力,因为我可以在coffeescript中编写所有服务器端代码,视图和客户端代码,我已经知道了.如果我沿着这条路走下去,我仍然不能100%确定我会采取哪种数据库路径.mongoose使得存储数据变得快速而简单,但考虑到我想到的数据模型(非常SQLish),缺乏真正的关系可能更难以工作.
Play Framework路径也很有吸引力,因为我在使用Java时非常了解框架,但我对Scala知之甚少,因此在学习该语言的过程中会对生产力产生影响.Anorm数据库访问层很吸引人,因为我可以手工编写我喜欢的SQL,并将结果自动映射到对象,这样可以省去很多工作.
我一直倾向于node.js,但我并没有在最好的数据库访问层上出售.任何人都有任何经验,可以分享一些见解?
我发现有这样的配置application.conf:
# If enabled, log SQL statements being executed.
db.default.logStatements=true
Run Code Online (Sandbox Code Playgroud)
我已启用它,但我找不到任何记录执行的sqls的日志文件.
我在哪里可以找到它,或者我会错过什么?
在anorm中使用"in"子句似乎并不容易:
val ids = List("111", "222", "333")
val users = SQL("select * from users where id in ({ids})").on('ids-> ???).as(parser *)
Run Code Online (Sandbox Code Playgroud)
如何更换???零件?
我试过了:
on('ids -> ids)
on('ids -> ids.mkString("'","','","'"))
on('ids -> ids.mkString("','")
Run Code Online (Sandbox Code Playgroud)
但都没有效果.
我在讨论中看到了完全相同的问题:https://groups.google.com/d/topic/play-framework/qls6dhhdayc/discussion,作者有一个复杂的解决方案:
val params = List(1, 2, 3)
val paramsList = for ( i <- 0 until params.size ) yield ("userId" + i)
// ---> results in List("userId0", "userId1", "userId2")
User.find("id in ({%s})"
// produces "id in ({userId0},{userId1},{userId2})"
.format(paramsList.mkString("},{"))
// produces Map("userId0" -> …Run Code Online (Sandbox Code Playgroud) 我正在使用Play!框架以及Anorm访问数据库.我经常看到如下例子,其中对象成员直接注入SQL语句.
我的问题是,这些投入是否已消毒?大多数示例如下所示:
object Person {
def save(p:Person) {
DB.withConnection ("default") { implicit connection =>
SQL("""
INSERT INTO person(firstName,lastName)
values ({firstName}, {lastName})
"""
).on(
"firstName" -> p.firstName,
"lastName" -> p.lastName
).executeUpdate()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我会试图通过黑客行为找出答案,但很容易犯错,所以我觉得要求更合适,我可以借鉴人群的智慧.
我正在使用Scala Play!使用Anorm将数据模型持久化到数据库的框架.我在这里遵循示例代码:
case class Bar(id: Pk[Long], name: String)
object Bar {
val simple = {
get[Pk[Long]]("id") ~
get[String]("name") map {
case id~name => Bar(id, name)
}
}
def findAll(): Seq[Bar] = {
DB.withConnection { implicit connection =>
SQL("select * from bar").as(Bar.simple *)
}
}
def create(bar: Bar): Unit = {
DB.withConnection { implicit connection =>
SQL("insert into bar(name) values ({name})").on(
'name -> bar.name
).executeUpdate()
}
}
}
Run Code Online (Sandbox Code Playgroud)
试图扩展它,我想检索刚刚创建的主键并将其存储在案例类中.
如何检索主键?
我发现play2的anorm的行解析器依赖于jdbc驱动程序返回的元数据.
所以在play提供的内置示例"zentasks"中,我可以找到这样的代码:
object Project {
val simple = {
get[Pk[Long]]("project.id") ~
get[String]("project.folder") ~
get[String]("project.name") map {
case id~folder~name => Project(id, folder, name)
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这些字段都有project.前缀.
它适用于h2数据库,但不适用于postgresql.如果我使用portgresql,我应该把它写成:
object Project {
val simple = {
get[Pk[Long]]("id") ~
get[String]("folder") ~
get[String]("name") map {
case id~folder~name => Project(id, folder, name)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在Play的谷歌小组中问过这个问题,Guillaume Bort说:
是的,如果你使用postgres它可能是原因.postgresql jdbc驱动程序已损坏,并且不返回表名.
如果postgresql的jdbc驱动程序确实有这个问题,我认为anorm会有一个问题:
如果两个表有相同名称的字段,并且我查询它们join,anorm将无法获得正确的值,因为它不能找出哪个名称属于哪个表.
所以我写了一个测试.
create table a (
id text not null primary key,
name text not …Run Code Online (Sandbox Code Playgroud) 我正在使用Scala和Anorm编写Playframework 2.0应用程序来访问db.
目前我使用Pk[Long]的id领域,我很担心额外的get访问实际值所需要的呼叫.所以我开始使用普通Long的id字段,一切仍然完美.
什么Pk是,我应该使用它而不是普通类型?Pk与普通类型相比,它能给我带来额外的功能吗?
是否可以为anorm的"on"方法动态创建列表?
我有一个带有可选输入的表单,目前我检查每个选项并创建一个包含已定义选项的列表,并尝试将其传递给anorm.目前我收到此编译错误
type mismatch; found : List[java.io.Serializable] required: (Any, anorm.ParameterValue[_])
Run Code Online (Sandbox Code Playgroud)
我不确定如何创建此列表.当前代码:
val onList = List(
'school_id = input.school,
if(input.rooms isDefined) ('rooms -> input.rooms) else "None" ,
if(input.bathrooms isDefined) ('bathrooms -> input.bathrooms) else "None" ,
if(input.houseType isDefined) ('houseType -> input.houseType) else "None" ,
if(input.priceLow isDefined) ('priceLow -> input.priceLow) else "None" ,
if(input.priceHigh isDefined) ('priceHigh -> input.priceHigh) else "None" ,
if(input.utilities isDefined) ('utilities -> input.utilities) else "None"
).filter(_!="None")
SQL("SELECT * FROM Houses WHERE " + whereString).on(onList).as(sqlToHouse *)
Run Code Online (Sandbox Code Playgroud)
我试过这样做,因为最初我认为它会是一样的
.on('rooms -> input.rooms, 'bathroom …Run Code Online (Sandbox Code Playgroud) 我正在研究anorm文档(来自播放框架)并且不清楚它是否支持常见的查询用例:动态过滤器,即用户在10字段搜索表单上填写2或3个搜索条件.
在这种情况下,如何在没有经典字符串操作的情况下动态构造查询?
似乎Play提供的所有示例应用程序!框架利用anorm来持久化.在ORM上选择anorm的原因是什么?如果您使用的是ORM,您使用的是什么?为什么?
anorm ×10
scala ×8
sql ×4
coffeescript ×1
logging ×1
mongodb ×1
node.js ×1
orm ×1
postgresql ×1
types ×1