Building for Electric
Electric maintains a fork of the original because we need a few tweaks on the upstream behaviour, specifically:
-
Set column defaults within the
CREATE TABLE (...)
block, rather than viaALTER TABLE .. SET DEFAULT
statements after the table creation. -
Define table constraints within the create table block too
Both of these are to support direct PostgreSQL -> SQLite command translation.
For example, SQLite does not support ALTER TABLE .. SET DEFAULT
and we are
currently very strict about the migrations that we allow on electrified tables.
So it’s best for our use case that tables are created in one shot, without
additional ALTER TABLE
commands.
As PG versions progress it may be necessary to update these functions, hence
this fork which applies our patches in the ddlx.sql
file which has
pre-processor statements for multiple PG version support.
Generating Electric extension SQL
For the purposes of Electric, “extension” does not mean a postgresql extension. Electric has its own extension mechanism based on simple SQL statements, maintained via a basic migration system.
That extension mechanism expects everything to be written within the electric
pg schema. PostgreSQL allows for extensions to be relocated into any schema via
the built-in extension mechanism. Since we can’t use that, we need to be able
to write our functions into a specific schema.
So we have a pre-processor script that prefixes all function definitions and
calls with a @schemaname@
prefix which we can replace when applying the sql
to the live pg database.
To generate a new “electrified” ddlx script, run the following:
make electric VERSION=$PG_VERSION
This will write a processed file to electric-ddlx-$PG_VERSION.sql
in this
repo.
This file should be moved into the electric repo somewhere under
components/electric/lib/electric/postgres/extension/migrations/$TIMESTAMP/ddlx-$PG_VERSION.sql
.
See the existing ddlx migration version for a template.