标签: squeryl

HowTo:Lift-Record-Squeryl中的自定义字段

我试图做一个EnumListField在电梯/录音/ Squeryl,类似MappedEnumListLiftMapper.存储类型应为Long/BIGINT.我明白,如果我定义:

def classOfPersistentField = classOf[Long]
Run Code Online (Sandbox Code Playgroud)

然后Squeryl会知道它应该创建一个BIGINT列.我知道它用于setFromAny()设置值,传入Long.我没有得到的一件是:

它将如何读取该领域的价值?如果它使用valueBox,它将得到一个Seq[Enum#Value],它将不知道如何将其变成一个龙.

我如何告诉Squeryl将我转换Seq[Enum#Value]为Long,或者定义一个返回Long的"getter",并且不与"普通"getter冲突?

scala record lift squeryl

92
推荐指数
1
解决办法
1185
查看次数

哪个项目更成熟,ScalaQuery还是Squeryl?

对我来说,如果它们具有功能,它们看起来都非常相似,但是如果不使用它们就很难说(但是).所以我几乎没有问题:

1)它们真的具有可比性(或多或少)吗?
2)有没有使用其中任何一个的企业或大型开源系统的例子?
3)我的印象是Squeryl有更好的文档,在ScalaQuery实际问题的情况下缺少文档?
4)其中哪一个增长更快和/或更快修复错误?
5)它们中的任何一个更容易使用/更高效吗?

sql scala jdbc squeryl scalaquery

19
推荐指数
0
解决办法
2717
查看次数

如何将Scala Squeryl ORB与play 2.0框架集成?

我试图在Play 2.0框架中使用Squeryl ORB,但DB.getConnection()在初始化期间调用时我得到:

错误路径:路径参数:无效路径' - 无法找到defaultdb的数据源':路径表达式中不允许使用令牌:' - '(如果您真的需要,可以双引号此令牌)

数据库配置如下所示(conf/application.conf):

db.default.url="jdbc:postgresql://localhost/mydb?user=postgres&password=postgres"
db.default.driver=org.postgresql.Driver
db.default.jndiName=defaultdb
Run Code Online (Sandbox Code Playgroud)

并初始化:

object Global extends GlobalSettings {
  override def onStart(app: Application) {

    SessionFactory.externalTransactionManagementAdapter = Some(() => 
        Some(new Session(
          DB.getConnection("defaultdb", true),
          new PostgreSqlAdapter)))
    ...
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?使用db.default.jndiName配置值作为参数值是否正确DB.getConnection()

或者应该这样做?:

  SessionFactory.concreteFactory = Some(() =>
    Session.create(
      java.sql.DriverManager.getConnection("jdbc:postgresql://..."),
      new PostgreSqlAdapter))
Run Code Online (Sandbox Code Playgroud)

这是有效的,但后来我无法在模板中使用squeryl查询对象进行迭代,我希望可以使用它externalTransactionManagementAdapter.

更新:

我更正了以下内容:DB.getConnection("default", true)并删除了db.default.jndiName配置.有了这个,我能够获得并使用一个连接,但第二次getConnection()被调用,它会抛出SQLException: Timed out waiting for a free available connection.

更新2:

我没有设法使用externalTransactionManagementAdapter,但concreteFactory效果很好 - 如下所述.

playframework squeryl

11
推荐指数
1
解决办法
2700
查看次数

Heroku内存泄漏与Play2 scala

正在对我的1 heroku dyno和dev数据库做一些拉伸(ab)测试,有20个连接限制.

在调用期间(使用squeryl访问数据库,堆分配正在增加导致R14(内存超过512MB))

我似乎无法重现问题(至少在本地水平).

有没有办法获得heroku堆转储并分析它以获得一些线索?

play2,scala,squeryl和heroku内存泄漏是否有任何已知问题?

更新

如果我在控制器的末尾做System.gc一切似乎都很好而且速度较慢...我在该调用时创建了很多对象但是不应该使用heroku的JVM来处理gc吗?另外,如果我定期调度gc调用不释放内存

scala heroku squeryl playframework-2.0

10
推荐指数
1
解决办法
1088
查看次数

会话必须使用Squeryl绑定错误

更新: 好的,我解决了我遇到的问题,但我仍然不太确定我做错了什么.无论如何,我在IRCDB中编写了以下方法:

def tryit[T](p: => T) = {
    Class.forName("org.h2.Driver") //what's the point in this...?

    SessionFactory.concreteFactory = Some(() =>
        Session.create(java.sql.DriverManager.getConnection("jdbc:h2:~/irc","ScalaIRC",""), new H2Adapter))

    transaction {
        p
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

 val query = from(IRCDB.channels)(c => select(c))
 IRCDB.tryit {
     for (r <- query) println("chan: " + r.name)
 }
Run Code Online (Sandbox Code Playgroud)

它现在有效.根据我的理解,我相信一旦使用SessionFactory创建会话,我就可以在transaction { ... }任何具有正确导入的地方使用.显然,我的理解是不正确的.

如果有人要添加任何东西请做.


所以,我刚刚开始使用Squeryl进行我正在进行的项目,所以这可能只是对我的疏忽.所以,首先是代码:

我有以下导入:

import org.squeryl.PrimitiveTypeMode._
import java.sql.Timestamp
import java.sql.DriverManager
import java.util.Date
import org.squeryl.adapters.H2Adapter
import org.squeryl.dsl.{OneToMany, ManyToOne, CompositeKey2}
import org.squeryl._
Run Code Online (Sandbox Code Playgroud)

我定义了下表:

class ChannelTable(val id: Long, val name : String,
               val p_mode …
Run Code Online (Sandbox Code Playgroud)

scala squeryl

9
推荐指数
1
解决办法
2831
查看次数

如何使Squeryl与Play一起工作!框架?

我正在尝试学习如何使用Play和Squeryl创建一个简单的数据库应用程序.我已经从Play教程制作了任务应用程序,但我想更改模型/架构,以便它使用Squeryl而不是Anorm.我一直在寻找不同的教程,示例和答案,但我还没有弄清楚如何做到这一点.

所以,给出Play Tutorial(ScalaTodoList)的源代码; 我如何继续使用Squeryl?

进一步来说:

  • 如何实现all(),create()以及delete()在我的模型的方法呢?(我想为任务使用自动递增ID)
  • 哪个数据库适配器使用目前很难在编码Build.scalaGlobal.scala(见下文).我怎样才能让它自动使用H2进行开发/测试和Heroku上的Postgres,就像Play教程中的Anorm一样?
  • 如何确保它自动创建我的表?

这就是我迄今为止所做的

我已经完成了Play ScalaTodoList教程.

project/Build.scala,object ApplicationBuild我添加了依赖项:

// From the "Squeryl Getting Started tutorial"
val posgresDriver = "postgresql" % "postgresql" % "8.4-702.jdbc4"
val h2 = "com.h2database" % "h2" % "1.2.127"

// From the "Squeryl Getting Started tutorial"
libraryDependencies ++= Seq(
  "org.squeryl" %% "squeryl" % "0.9.5",
  h2
)

// From the Play tutorial
val appDependencies …
Run Code Online (Sandbox Code Playgroud)

scala playframework squeryl playframework-2.0

8
推荐指数
1
解决办法
3249
查看次数

玩迁移替代品

我即将开始一个将使用Play的新项目!2 Scala的框架,可能使用Squeryl作为ORM(但也许Slick也会没问题,如果及时准备的话).

现在,玩!具有使用迁移升级数据库的功能.不幸的是,这些迁移是用SQL编写的.这不仅带来不便(我希望能够在Scala中编写迁移),但有两个问题

  • 首先,我需要自己编写迁移.我已经习惯了South,它能够通过查看模型的当前和以前的定义来推断模式迁移;
  • 第二,处理数据迁移将非常麻烦.可能需要以编程方式更改数据,这在普通SQL中甚至可能无法实现.

所以,我正在寻找替代方案.我无法为任何会自动生成模式迁移的Scala ORM找到任何迁移工具,有没有?

我能找到的最好的工具是Scala迁移.有没有办法让玩!自动使用它代替自己的迁移工具?

migration scala playframework squeryl

8
推荐指数
3
解决办法
3316
查看次数

在squeryl引用表名

我在mysql db中有一个名为group的表.当我将此表映射到squeryl时,我得到SQL语法错误,因为没有引用表名组(应该从`group`中选择*).

有什么方法可以告诉squeryl引用某些表名吗?

scala squeryl

6
推荐指数
1
解决办法
286
查看次数

Squeryl:显式运行查询

当我在squeryl中创建一个查询时,它返回一个Query [T]对象.查询尚未执行,并且当我遍历Query对象时(Query [T]扩展Iterable [T]).

在执行查询时,必须有一个事务{}或一个inTransaction {}块.

我只是谈论SELECT查询而不需要交易,但是squeryl框架需要它们.

我想在我的应用程序模型中创建一个查询,并将其直接传递给视图,其中模板中的视图助手迭代它并呈现数据.这只有在将事务{}块放在控制器中时才有可能(控制器包含模板的调用,因此进行迭代的模板也在内部).将事务{}块放在模型中是不可能的,因为模型并不真正执行查询.

但据我了解,交易与控制器无关.这是模型的决定,使用哪个数据库框架,如何使用它以及在何处使用事务.所以我希望transaction {}块在模型中.

我知道我可以 - 而不是返回Query [T]实例 - 在此Query [T]对象上调用Iterable [T] .toList,然后返回创建的列表.然后整个查询在模型中执行,一切都很好.但我不喜欢这种方法,因为数据库中请求的所有数据都必须缓存在此列表中.我更喜欢这种数据直接传递给视图的方式.我喜欢在结果集很大的时候流式传输结果集的MySql功能.

有可能吗?也许类似函数Query [T] .executeNow()将请求发送到数据库,能够关闭事务,但仍然使用MySQL流功能并接收剩余的(选定的,因此固定的)结果集它被访问了吗?因为结果集在查询时刻是固定的,所以关闭事务应该不是问题.

orm scala playframework squeryl playframework-2.0

5
推荐指数
1
解决办法
1290
查看次数

value ===不是类型参数TKey的成员(使用Squeryl)

我正在尝试使用优秀的squeryl ORM框架编写一个简单的BaseDao类.

但是,当使用通用类型键时,我遇到了一个问题.当我尝试在我的通用BaseDao类中使用'==='运算符时,我收到编译错误.编译错误是:value ===不是类型参数TKey的成员

我的dao类及其麻烦的方法定义为:

import org.squeryl.PrimitiveTypeMode._
import org.squeryl._

abstract class BaseDao[TKey, T <: BaseEntity[TKey]](val table: Table[T]) {

  def delete(entity: T) : Boolean = {
    table.deleteWhere(record => record.id === entity.id) //This is where I get the compile error
  }
}
Run Code Online (Sandbox Code Playgroud)

BaseEntity定义为:

abstract class BaseEntity[TKey] extends KeyedEntity[TKey]
Run Code Online (Sandbox Code Playgroud)

我也在我的Dao类中导入PrimitiveTypeMode ...我的第一个虽然是TKey需要被约束到===运算符被约束的任何东西,但是在查看源代码时,似乎没有任何明确的约束操作员,所以我有点迷茫.

运算符在这里的squeryl源中定义:https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/dsl/TypedExpression.scala

generics scala squeryl

5
推荐指数
1
解决办法
380
查看次数