即使你要求不要,我也要给一个大大的警告:这条路有龙!
可以这样想:要编写始终如 SQL 层所期望的数据,您将不得不重新实现 SQL 层。
学术演示如下:)
盯着表格和行:
CREATE TABLE test.t(id INT NOT NULL PRIMARY KEY, str VARCHAR(32)) STORAGE_FORMAT tuple;
INSERT INTO test.t VALUES (1, 'one');
Python 读取当前行并添加新行:
import fdb
import fdb.tuple
fdb.api_version(200)
db = fdb.open()
# Directory for SQL Layer table 'test'.'t'
tdir = fdb.directory.open(db, ('sql', 'data', 'table', 'test', 't'))
# Read all current rows
for k,v in db[tdir.range()]:
print fdb.tuple.unpack(k), '=>', fdb.tuple.unpack(v)
# Write (2, 'two') row
db[tdir.pack((1, 2))] = fdb.tuple.pack((2, u'two'))
最后,从 SQL 中读回数据:
test=> SELECT * FROM t;
id | str
----+-----
1 | one
2 | two
(2 rows)
这里发生了什么:
- 使用 STORAGE_FORMAT 选项创建一个包含键和值作为元组的表
- 插入一行
- 导入并打开 FDB
- 打开表的目录
- 扫描所有行并打开包装进行打印
- 通过创建包含预期值的元组来添加新行
密钥包含三个组件(类似于(230, 1, 1)
):
- 目录前缀
- 表的序号,SQL 层表组内的标识符
- PRIMARY KEY 的值
该值包含表中的列,按照它们的声明顺序。
现在我们有了一个简单的概念证明,以下是保持数据正确性具有挑战性的几个原因:
- 未检查架构生成、元数据和数据格式版本
- PRIMARY KEY 未维护,仍处于“内部”格式
- 无需维护二级索引
- 表组中没有其他表要维护(即测试表是单个表组)
- 在线 DDL 被忽略,这(基本上)使 DML 期间要做的工作量翻倍
还需要注意的是,这些注意事项仅适用于编写要通过 SQL 层访问的数据。相反,读取SQL 层写入的数据要容易得多,因为它不必担心这些问题。
希望这能让您了解范围!