Blocks order
There are cases when queries order matters. Like tables creation, for example.
And Snaql has solution to mark blocks dependencies with depends_on
list.
{% query 'create_nodes', depends_on=['create_templates', 'create_flavors'] %}
CREATE TABLE nodes (
id VARCHAR(50) NOT NULL,
type VARCHAR(6),
properties VARCHAR(1024),
template_id VARCHAR(36),
flavor_id VARCHAR(36),
PRIMARY KEY (id),
FOREIGN KEY(template_id) REFERENCES templates (id),
FOREIGN KEY(flavor_id) REFERENCES flavors (id)
)
{% endquery %}
{% query 'create_templates' %}
CREATE TABLE templates (
id VARCHAR(36) NOT NULL,
type VARCHAR(20),
name VARCHAR(50),
properties VARCHAR(1024),
PRIMARY KEY (id)
)
{% endquery %}
{% query 'create_clusters', depends_on=['create_templates', 'create_nodes'] %}
CREATE TABLE clusters (
id VARCHAR(50) NOT NULL,
name VARCHAR(50),
template_id VARCHAR(36),
FOREIGN KEY(template_id) REFERENCES templates (id)
)
{% endquery %}
{% query 'create_flavors' %}
CREATE TABLE flavors (
id VARCHAR(36) NOT NULL,
properties VARCHAR(1024),
PRIMARY KEY (id)
)
{% endquery %}
Correct execution order can be fetched with special ordered_blocks
attribute.
migrate_queries = snaql_factory.load_queries('migrations.sql')
solution = migrate_queries.ordered_blocks
# It is a list of ordered functions like
solution == [
create_flavors_fn
create_templates_fn,
create_nodes_fn,
create_clusters_fn,
]