前言

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

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

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

使用 SandstoneDB 的场景

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

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

使用

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

安装

1
2
3
4
Gofer new
    squeaksource: 'SandstoneDb';
    package: 'SandstoneDb';
    load.

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

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

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

测试一下

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

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

.

开始使用

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

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

1
2
3
4
5
SDActiveRecord subclass: #Person
	instanceVariableNames: 'name'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'Data-Fun'

实例方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Person>>name

    ^ name

Person>>name: aString

    name := aString

printOn: aStream
	
	aStream nextPutAll: self name

类方法:

1
2
3
Person class>>named: aString

    ^ self new name: aString

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

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

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

在 Workspace 里创建 3 条数据:

1
2
3
4
5
(Person named: 'joe') save.
(Person named: 'bob') save.
(Person named: 'alice') save.

Person findAll size.

直接退出 image.

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

版本信息

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

Squeak: Squeak6.1alpha-22143-64bit

SandstoneDb:

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

参考