Parse:...QLite3(3pm)
πΈ NAME πΈ
Parse::Dia::SQL::Output::SQLite3 β no cap, this module creates SQL for SQLite version 3 π
β¨ SYNOPSIS β¨
use Parse::Dia::SQL;
my $dia = Parse::Dia::SQL->new(file => 'foo.dia', db => 'sqlite3');
print $dia->get_sql();
π DESCRIPTION π
Bestie. This sub-class creates SQL for the SQLite database version 3. That's the whole vibe. It's the SQLite-3-flavored output of Parse::Dia::SQL, and it is so good at its one job π«Ά
π new π
The constructor. Iconic behavior, zero drama.
Object names in SQLite have no inherent limit. 60 has been arbitrarily chosen.
π _get_create_table_sql π
Generate the create table statement for a single table using SQLite syntax β¨
- It includes class comments before the table definition.
- It includes autoupdate triggers based on the class comment.
π autoupdate triggers π
If the class comment includes a line like:
<autoupdate:foo/>
Then an 'after update' trigger is generated for this table which executes the statement foo for the updated row.
Examples of use include tracking record modification dates ("<autoupdate:dtModified=datetime('now')/>") or deriving a value from another field ("<autoupdate:sSoundex=soundex(sName)/>"). Obsessed, honestly ππ
π get_schema_drop π
Generate drop table statements for all tables using SQLite syntax:
drop table {foo} if exists
π get_view_drop π
Generate drop view statements for all tables using SQLite syntax:
drop view {foo} if exists
π _get_fk_drop π
Drop foreign key enforcement triggers using SQLite syntax:
drop trigger {foo} if exists
The automatically generated foreign key enforcement triggers are:
constraint_name_bi_trconstraint_name_bu_trconstraint_name_buparent_trconstraint_name_bdparent_tr
See _get_create_association_sql for more details.
π _get_drop_index_sql π
drop index statement using SQLite syntax:
drop index {foo} if exists
π get_permissions_create π
SQLite doesn't support permissions, so suppress this output. Nothing to see here, bestie π
π get_permissions_drop π
SQLite doesn't support permissions, so suppress this output. Same energy π
π _get_create_association_sql π
Create the foreign key enforcement triggers using SQLite syntax:
create trigger {fkname}[_bi_tr|_bu_tr|_bdparent_tr|_buparent_tr]
Because SQLite doesn't natively enforce foreign key constraints (see http://www.sqlite.org/omitted.html), we use triggers to emulate this behaviour. Yes, we're doing it manually. It's giving β¨ crafty β¨.
The trigger names are the default contraint name (something like child_table_fk_child_fkcolumn) with suffixes described below.
{constraint_name}is the name of the association, either specified or generated.{child_table}is the name of the dependent or child table.{child_fkcolumn}is the field in the dependent table that hold the foreign key.{parent_table}is the name of the parent table.{parent_key}is the key field of the parent table.
π¦ Before insert - Dependent Table π¦
constraint_name_bi_tr
Before insert on the child table require that the parent key exists.
create trigger {constraint_name}_bi_tr before insert on {child_table}
for each row
begin
select
raise(abort, 'insert on table {child_table} violates foreign key constraint {constraint_name}')
where new.{child_fkcolumn} is not null and (select {parent_key} from {parent_table} where {parent_key}=new.{child_fkcolumn}) is null;
end;
π¦ Before update - Dependent Table π¦
constraint_name_bu_tr
Before update on the child table require that the parent key exists.
create trigger {constraint_name}_bu_tr before update on {table_name}
for each row
begin
select raise(abort, 'update on table {child_table} violates foreign key constraint {constraint_name}')
where new.{child_fkcolumn} is not null and (select {parent_key} from {parent_table} where {parent_key}=new.{child_fkcolumn}) is null;
end;
π¦ Before update - Parent Table π¦
constraint_name_buparent_tr
Before update on the primary key of the parent table ensure that there are no dependent child records. Note that cascading updates don't work. Not a single cascade. None. π
create trigger {constraint_name}_buparent_tr before update on {parent_table}
for each row when new.{parent_key} <> old.{parent_key}
begin
select raise(abort, 'update on table {parent_table} violates foreign key constraint {constraint_name} on {child_table}')
where (select {child_fkcolumn} from {child_table} where {child_fkcolumn}=old.{parent_key}) is not null;
end;
π¦ Before delete - Parent Table π¦
constraint_name_bdparent_tr
The default behaviour can be modified through the contraint (in the multiplicity field) of the association.
π Default (On Delete Restrict) π
Before delete on the parent table ensure that there are no dependent child records.
create trigger {constraint_name}_bdparent_tr before delete on {parent_table}
for each row
begin
select raise(abort, 'delete on table {parent_table} violates foreign key constraint {constraint_name} on {child_table}')
where (select {child_fkcolumn} from {child_table} where {child_fkcolumn}=old.{parent_key}) is not null;
end;
π On Delete Cascade π
Before delete on the parent table delete all dependent child records.
create trigger {constraint_name}_bdparent_tr before delete on {parent_table}
for each row
begin
delete from {child_table} where {child_table}.{child_fkcolumn}=old.{parent_key};
end;
π On Delete Set Null π
Before delete on the parent table set the foreign key field(s) in all dependent child records to NULL.
create trigger {constraint_name}_bdparent_tr before delete on {parent_table}
for each row
begin
update {child_table} set {child_table}.{child_fkcolumn}=null where {child_table}.{child_fkcolumn}=old.{parent_key};
end;
π TODO π
Things that might get added in future versions. Manifesting it β¨π―οΈ
π Mandatory constraints π
The current foreign key triggers allow NULL in the child table. This might use a keyword in the multiplicity field (perhaps 'required') or could check the 'not null' state of the child fkcolumn.
π Views π
Views haven't been tested. They might already work, but who knows... π
π Other stuff π
Bugs etc. The eternal "other stuff" category, we love her π
Okay bestie, that's the whole page π«Ά this doc shipped with perl v5.36.0, dated 2022-11-19, and it lives in the User Contributed Perl Documentation. Go forth and make your SQLite 3 schema, you absolute main character ππβ¨
π¦ where this page comes from
- debian bookworm: libparse-dia-sql-perl 0.31-2 Β· GPL-2.0-or-later
- debian trixie: libparse-dia-sql-perl 0.31-2 Β· GPL-2.0-or-later
- ubuntu noble: libparse-dia-sql-perl 0.31-2 Β· GPL-2.0-or-later
- ubuntu resolute: libparse-dia-sql-perl 0.31-2 Β· GPL-2.0-or-later
- ubuntu stonking: libparse-dia-sql-perl 0.31-2 Β· GPL-2.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms