CQL schema generation helpers for ScyllaDB.
This module generates raw CQL DDL statements (CREATE TABLE, CREATE INDEX, CREATE TYPE, etc.) from Ash resource definitions. It is NOT an Ecto SQL migration runner — CQL has no transactional DDL concept.
These helpers return CQL strings that you execute via AshScylla.Migrator.run/3
in your migration modules, or directly through your repo at runtime.
Example Migration
defmodule MyApp.Repo.Migrations.CreateUsers do
def change do
AshScylla.Migration.create_table_cql(MyApp.User)
|> then(&AshScylla.Migrator.run!/3)
end
endImportant Note on create_table_cql/1
This function reads compile-time module attributes set by the Ash resource DSL.
For runtime use, prefer Ash.Resource.Info.attributes/1 combined with
AshScylla.DataLayer.Dsl.table/1.
Summary
Functions
Generates CQL for altering a UDT (add or rename fields).
Converts an Ash type atom to its CQL type string representation.
Generates CQL CREATE INDEX statements for secondary indexes.
Generates a CQL CREATE TABLE statement for an Ash resource.
Define a User Defined Type (UDT) in ScyllaDB.
Generates CQL for creating a UDT from a type name and field specs.
Generates a CQL DROP INDEX statement for a secondary index.
Drop a User Defined Type (UDT) in ScyllaDB.
Generates CQL for dropping a UDT.
Executes migration CQL via the Migrator.
Returns the keyspace for a resource if configured via DSL. Note: This is a placeholder for future DSL implementation.
Generates CQL to list all UDTs in the keyspace.
Generates CQL to check if a UDT exists.
Functions
Generates CQL for altering a UDT (add or rename fields).
Examples
alter_type_cql("address", :add, [country: :text])
alter_type_cql("address", :rename, [new_zip: :zip_code])
Converts an Ash type atom to its CQL type string representation.
Examples
iex> AshScylla.Migration.ash_type_to_cql_type(:uuid, [])
"UUID"
iex> AshScylla.Migration.ash_type_to_cql_type(:string, [])
"TEXT"
iex> AshScylla.Migration.ash_type_to_cql_type(:map, key_type: "TEXT", value_type: "INT")
"MAP<TEXT, INT>"
Generates CQL CREATE INDEX statements for secondary indexes.
Returns a list of CQL strings that should be executed in migrations.
Example
defmodule MyApp.Repo.Migrations.CreateUserIndexes do
def change do
AshScylla.Migration.create_secondary_indexes_cql(MyApp.User)
|> Enum.each(&AshScylla.Migrator.run!/3)
end
end
Generates a CQL CREATE TABLE statement for an Ash resource.
Returns a raw CQL string. Execute it in a migration via AshScylla.Migrator.run/3
or directly through your repo at runtime.
@spec create_type( String.t(), keyword() ) :: String.t()
@spec create_type(String.t() | atom(), [{atom(), atom()}]) :: String.t()
Define a User Defined Type (UDT) in ScyllaDB.
Supports two calling styles:
Keyword-list style (with do block)
create_type "full_name" do
field :first_name, :text
field :last_name, :text
endExplicit field-list style
create_type("address", city: :text, street: :text, zip: :text)Both generate:
CREATE TYPE IF NOT EXISTS <name> (field1 TYPE1, field2 TYPE2)
Generates CQL for creating a UDT from a type name and field specs.
Returns a raw CQL string.
Generates a CQL DROP INDEX statement for a secondary index.
Drop a User Defined Type (UDT) in ScyllaDB.
Generates CQL for dropping a UDT.
Returns a raw CQL string.
Executes migration CQL via the Migrator.
Returns the keyspace for a resource if configured via DSL. Note: This is a placeholder for future DSL implementation.
@spec list_types_cql() :: String.t()
Generates CQL to list all UDTs in the keyspace.
Returns a raw CQL string.
Generates CQL to check if a UDT exists.
Returns a raw CQL string.