惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
G
GRAHAM CLULEY
S
Schneier on Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
Recorded Future
Recorded Future
I
Intezer
云风的 BLOG
云风的 BLOG
博客园 - Franky
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
T
Tenable Blog
The Hacker News
The Hacker News
T
The Blog of Author Tim Ferriss
Attack and Defense Labs
Attack and Defense Labs
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
N
News and Events Feed by Topic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Secure Thoughts
The Register - Security
The Register - Security
B
Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
The Cloudflare Blog
Webroot Blog
Webroot Blog
W
WeLiveSecurity
H
Heimdal Security Blog
博客园 - 三生石上(FineUI控件)
V
Vulnerabilities – Threatpost
G
Google Developers Blog
O
OpenAI News
V
V2EX
罗磊的独立博客
博客园_首页
N
News | PayPal Newsroom
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
TaoSecurity Blog
TaoSecurity Blog
Cloudbric
Cloudbric
H
Hacker News: Front Page
博客园 - 叶小钗
T
Tor Project blog
AI
AI

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
SandstoneDb: Squeak 中的简易持久化存储
种瓜 · 2022-09-08 · via 夜行人

文章目录

前言

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

参考