在 SORM 中更新数据似乎是可能的(尽管有人告诉我它针对的是不可变数据......)
Posted
技术标签:
【中文标题】在 SORM 中更新数据似乎是可能的(尽管有人告诉我它针对的是不可变数据......)【英文标题】:Updating data in SORM seems possible (even though I was told it aimed at immutable data...) 【发布时间】:2013-08-15 15:15:24 【问题描述】:有人告诉我 SORM 的目标是不可变数据。它没有写在网站上 - 至少不是我正在查看的主要部分,所以我对索赔的僵化感到有点惊讶。我只是知道它会建议这样做。但也许我只是错过了一些东西。
这些示例告诉您在对对象调用 Db.save() 之前使用“.copy(propery = newvalue)”。所以这是一个提示。
我很感兴趣如果我只是更改数据并在数据库中更新它会发生什么。奇怪的是,以下工作正常:
case class Agent( var name : String )
object Db extends Instance(
entities = Set( Entity[Agent]() ),
url = "jdbc:h2:mem:hansi"
)
class SORMTest extends FunSuite
test("Update")
// Store values in the db:
val agent = Db.save( Agent("test") )
agent.name = "hansi"
Db.save(agent)
它在数据库中生成了一条更新语句,该语句更改了相应 id 的 name 属性。
这样做是不是有点疯狂?有开发者提供的 cmet 吗?
【问题讨论】:
【参考方案1】:有人告诉我 SORM 的目标是不可变数据。网站上没有写
SORM 多次强调遵循函数式编程习惯。这意味着仅对不可变数据结构进行操作。
这些示例告诉您在对对象调用 Db.save() 之前使用“.copy(propery = newvalue)”。
那就是你错了。这些示例告诉您使用 .copy(..)
获取被调用对象的更新不可变值,在调用 Db.save()
之前调用它,如下所示:
agent.copy(name = "new name")
Db.save(agent)
绝对不会产生任何影响,因为.copy()
不会改变它所调用的对象,而是返回该对象的更新副本。所以正确的用法如下:
val updatedAgent = agent.copy(name = "new name")
Db.save(updatedAgent)
或者简单地说:
Db.save( agent.copy(name = "new name") )
但事实是,上述所有内容与 SORM 的关系与它与 Scala 中的函数式编程的关系一样大。这实际上是关于应该如何使用案例类的非常基本的东西。所以请帮自己一个忙,向自己介绍函数式编程的基础知识。这将消除您已经提出的关于 SORM 的所有问题,而且我敢肯定,还有很多其他问题。
您的示例有效并且应该有效,但它并没有改变这样一个事实,即它违背了函数式编程的基本习惯,因此是 SORM 的单一用法。
【讨论】:
我不喜欢你的反应咄咄逼人或恼怒的语气。你删掉了我说我可能只是错过了一些东西的部分。现在当我描述复制保存过程时你误会了,因为我很清楚复制不会改变旧对象的状态。假设我不知道,对我来说有点愚蠢。看不到 SORM 的目标是纯粹的功能风格的迹象对你来说似乎有点愚蠢。但我没有看到它们,我仍然想知道我应该在哪里看到它们。 可能像我这样的人倾向于将不可变数据视为函数式编程的概念,这并不总是最佳方法。 Haskell Wiki 例如声称:“纯功能程序通常在不可变数据上运行。” (无论哪只狗写了这个——我认为这是一个非常合适的引用)。在远非纯函数式语言的 Scala 中,我不希望“函数式风格”(正如 SORM 网站上所说的那样)完全纯正。 因为与其他 Scala ORM 相比,这在 SORM 中似乎有所不同,我希望在文档中更清楚地看到它的下划线。但这完全取决于你。我并不是想让你的作品看起来不那么闪亮或不那么有价值。我认为你应该更明确地说明你提供的好东西。 尽管如此 SORM 似乎可以处理这种“滥用”,但我仍然感到惊讶。我只是好奇会发生什么。即使我愿意,我也不会那样使用它。它可能随时中断 - 您不会对某种滥用进行测试。 你必须承认你的问题很模糊,所以我所做的只是试图猜测你真正在问什么,所以,当然,我可能会提出一些错误的假设,但我真的看不出你觉得我的回答有什么冒犯性的。功能方式几乎总是最好的方式。您说您倾向于将不可变数据结构视为一种非最佳方法,我必须重申您需要了解更多有关函数式编程的信息。是的,这种语言并不纯粹,但它的高级用户倾向于以纯粹的方式专门使用它。 Scalaz 支持这一说法。以上是关于在 SORM 中更新数据似乎是可能的(尽管有人告诉我它针对的是不可变数据......)的主要内容,如果未能解决你的问题,请参考以下文章