Mount names
Entities, objects, operations, and queries have mount names:
- for entities and objects, those names are the SQL table names where the data gets stored
- for operations and queries, you use a mount name to invoke an operation or a query from the outside
By default, you define a mount name by a fully qualified name of a definition.
Example
namespace foo {
namespace bar {
entity user {}
}
}
The mount name for the user entity becomes foo.bar.user, reflecting its hierarchical position.
Custom mount names
You can use the @mount annotation to specify a custom mount name. You can specify the @mount annotation for
entities, objects, operations, and queries.
Syntax: @mount('desired_mount_name')
Example
@mount('foo.bar.user')
entity user {}
Entity attributes
Since 0.15.1, you can apply @mount to an entity attribute, where it names the database column that stores the
attribute. This lets you rename an attribute in code while keeping the existing column and its data:
// existing deployment
entity user { fname: text; age: integer; }
// rename without data loss
entity user {
@mount('fname') first_name: text;
age: integer;
}
No schema changes are performed. The column fname continues to store the data and is accessed as user.first_name in
code. Keys, indexes, metadata, and size constraints are generated using the mapped column name, so database
initialization no longer drops or recreates columns during such renames.
Mounting namespaces
Prefix elements within a namespace with a custom mount name.
Example
@mount('foo.bar')
namespace ns {
entity user {}
}
The resulting mount name for user is foo.bar.user.
Mounting modules
Prefix elements within a module with a custom mount name.
Example
@mount('foo.bar')
module;
entity user {}
The resulting mount name for user is foo.bar.user.
Nested namespace mounts
When @mount is applied to a namespace or module, elements inside inherit the mount context. Nested elements can then
define mount names relative to this context. For example, when defined in a namespace:
Example
@mount('a.b.c')
namespace ns {
entity user {}
}
The entity user has the following mount names when annotated with @mount:
@mount('.d.user')->a.b.c.d.user@mount('^.user')->a.b.user@mount('^^.x.user')->a.x.user
Relative mount name shortcuts
Construct complex mount names relative to context using special characters:
.(dot): Appends names to the current context mount name.^(caret): Removes the last part from the context mount name.
@mount("foo.")
entity user {
}
// mount name = "foo.user"
@mount("foo")
entity user {
}
// mount name = "foo"
Import behavior
Mount names are set at the point where entities, objects, operations, and queries are defined, not where they are imported. Importing a module into a namespace with a different mount name does not change the mount names of the imported definitions.
// snapshots.rell
@mount("eif.snapshots")
module;
entity my_entity {}
// hbridge.rell
@mount("foo")
namespace bar {
import ^.eif_snapshots.*;
}
The my_entity will have mount name eif.snapshots.my_entity regardless of where it's imported.
Special operations
Special operations require the __ prefix in their mount names. Use dot notation for consistency with Rell conventions:
// ✅ Preferred: Use dots for mount names
@mount('icmf.message')
operation __icmf_message() {}
@mount('stork.oracle.prices')
operation __stork_oracle_prices() {}
// ❌ Avoid: Using underscores in mount names
// @mount('icmf_message')
// operation __icmf_message() {}
The __ prefix is required for all special operations and must be explicitly written. It is recognized by Postchain to
denote lifecycle hooks and reserved operations.