Dflat: SQLite FlatBuffers
github.com
github.com
I've deployed it in production on a few apps so far, and it has been a real joy to use.
> We can uniquely identify an object, even if it is deleted later, without worrying a new object could occupy the same rowid
I don’t know anything about mobile and not sure if it applies here but if you call vacuum on sqlite, it rewrites row ids. Is there a way to prevent that? If you have a column “PRIMARY KEY INTEGER”, it is your row id and it won’t change on vacuum, otherwise if you rely on automatic row id, you may have a surprise later.
sqlite> CREATE TABLE t(x);
sqlite> INSERT INTO t(x) VALUES ('foo'), ('bar');
sqlite> SELECT rowid, x FROM t;
1|foo
2|bar
sqlite> DELETE FROM t WHERE x='bar';
sqlite> INSERT INTO t(x) VALUES ('baz');
sqlite> SELECT rowid, x FROM t;
1|foo
2|baz
This is true even if rowid is aliased by an INTEGER PRIMARY KEY. Whenever a row is inserted, the new rowid is simply 1 greater than the largest rowid in use (or 1 for an empty table).But Dflag is using:
rowid INTEGER PRIMARY KEY AUTOINCREMENT
which prevents ids from being reused. So this isn't actually a problem for them, but the documentation could be clearer about it.Thanks. Just to be clear, I think this is the scenario when you don’t set your primary key but other columns in your insert statement.
CREATE TABLE t(x INTEGER PRIMARY KEY, y);
INSERT INTO(y) VALUES(‘value’);
Otherwise, if you set primary key in your insert statements, you’ll be fine I guess.
I’m not worried about reusing ids but if ids change e.g on vacuum, it is a disaster. Because people use row id(via last_insert_row_id()) assuming it won’t change but vacuum changes it and now you have a “dangling id”, if you fetch data again with that id, either you won’t find the row or get some other random row.
Very few people use Bazel for Android or iOS. Anyone not from Google care to let us know if you're using Bazel for mobile development?
Pinterest uses bazel for their iOS app: https://medium.com/pinterest-engineering/developing-fast-rel...
It's been a while since I've looked into flatbuffers (back when I was into 3D I wanted an efficient binary serialisation framework) - but I kind of like the idea of automatically creating a flatbuffers layer on top of a relational DB, something PostgREST like - but instead of going flatbuffer schema -> generate DB schema I'd go the other way -> generate flatbuffer schema from existing DB schema and allow some manual editing/mapping.