3

SandstoneDb: Squeak 中的简易持久化存储

 2 years ago
source link: http://wwj718.github.io/post/%E7%BC%96%E7%A8%8B/sandstonedb-squeak/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SandstoneDb: Squeak 中的简易持久化存储

2022-09-08

Seaside 文档所言, 不同的情况下,有不同的存储需求:

  • 如果你在编写小型演示程序,并希望在系统中填充一些典型数据。使用类实例变量来存储数据,然后简单地保存 image 就行了。这种情况下,直接存储 image 是最简单的。
  • 如果你有一个包含几十万个对象的小型系统,并且不想依赖于外部系统. SandstoneDB 可能是一个完美选择。对象将保存在文件系统里, 并保留了一些旧版本的数据,因此备份或恢复很容易。
  • 如果你有一个遗留的关系数据库,需要为其编写了大量报表。可使用 ORM。
  • 如果你有一个复杂且大型的对象模型,它必须支持在开发时更改对象模型。解决方案是 OODB。Gemstone 是经过验证的大型商业产品。

SandstoneDB 足以覆盖多数人的多数用例,SandstoneDb, Simple ActiveRecord Style Persistence in Squeak 对此有精彩论述。

使用 SandstoneDB 的场景

以下是我自己可能会用到 SandstoneDB 的场景:

  • 使用 Seaside 构建小型 Web 应用
  • 数据类型的应用(如爬虫)
  • 将 Squeak 作为日常工作环境使用时,需要 SandstoneDB 实时持久化一些实例数据(诸如备忘录),避免图像意外崩溃造成的数据丢失

SandstoneDb 文档匮乏,而且一些过时的信息已经不再适用(如这个视频演示)。以下是我的使用笔记,供其他新用户参考 (Squeak/Pharo 中应该都能使用).

Gofer new
    squeaksource: 'SandstoneDb';
    package: 'SandstoneDb';
    load.

SandstoneDb 支持多种不同的存储后端, 在此我们使用基于文件系统的存储后端。

打开 Monticello,加载我们需要的存储后端: SandstoneDbFileDirectoryStore, 其中包含 SDFileStore 类。SandstoneDbFileDirectoryStore 依赖于SandstoneDbTests,所以先加载SandstoneDbTests。如果你跟我一样在使用 Squeak,建议也顺便加载 SandstoneDbSqueak

SandstoneDb-03.png

完成后,你应该能够在 browser 里看到这几个包:

SandstoneDb-02.png

Test Runner运行测试看看是否一切正常

SandstoneDb-04.png

如果一切正常,你应该会在 Squeak 目录里看到 SandstoneDb 的数据目录:

SandstoneDb-05.png
.

结下来就可以开始创建我们的第一个数据类:

开始创建我们的第一个数据存储类: Person

SDActiveRecord subclass: #Person
	instanceVariableNames: 'name'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'Data-Fun'

实例方法:

Person>>name

    ^ name

Person>>name: aString

    name := aString

printOn: aStream
	
	aStream nextPutAll: self name
Person class>>named: aString

    ^ self new name: aString

创建完成后,保存并退出 image。再次加载 image,你就能在 Squeak 目录里(跟 image 在同一层级)看到:

SandstoneDb-06.png

每次创建完新的数据类,需要保存并退出 image, 来创建本地数据仓库。

现在就可以开始使用 SandstoneDb 持久化的能力了。

在 Workspace 里创建 3 条数据:

(Person named: 'joe') save.
(Person named: 'bob') save.
(Person named: 'alice') save.

Person findAll size.

直接退出 image.

SandstoneDb-07.png

再次进入镜像, 运行 Person findAll size. 发现存在 3 条数据,说明这些数据已经在镜像之外持久化了.

在次列出我的系统和软件包信息:

Squeak: Squeak6.1alpha-22143-64bit

SandstoneDb:

  • SandstoneDb-tcj.152
  • SandstoneDbFileDirectoryStore-RamonLeon.2
  • SandstoneDbSqueak-RamonLeon.1
  • SandstoneDbTests-RamonLeon.13

文章作者 种瓜

上次更新 2022-09-08

下一篇


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK