View Source Ecto.Adapters.DynamoDB.Migration (ecto_adapters_dynamodb v3.5.0)
Implements Ecto migrations for create table and alter table.
The functions, add, remove and modify correspond to indexes on the DynamoDB table. Using add, the second parameter, field type (which corresponds with the DynamoDB attribute) must be specified. Use the third parameter to specify a primary key not already specified. For a HASH-only primary key, use primary_key: true as the third parameter. For a composite primary key (HASH and RANGE), in addition to the primary_key specification, set the third parameter on the range key attribute to range_key: true. There should be only one primary key (hash or composite) specified per table.
To specify index details, such as provisioned throughput, create_if_not_exists/drop_if_exists, billing_mode, and global and local indexes, use the options keyword in create table and alter table, please see the examples below for greater detail.
Please note that change may not work as expected on rollback. We recommend specifying up and down instead.
Example:
# Migration file 1:
def change do
create table(:post,
primary_key: false,
options: [
global_indexes: [
[index_name: "email_content",
keys: [:email, :content],
provisioned_throughput: [100, 100]] # [read_capacity, write_capacity]
],
provisioned_throughput: [20,20]
]) do
add :email, :string, primary_key: true # primary composite key
add :title, :string, range_key: true # primary composite key
add :content, :string
end
end
# Migration file 2:
def up do
create_if_not_exists table(:rabbit,
primary_key: false,
options: [
billing_mode: :pay_per_request,
global_indexes: [
[index_name: "name",
keys: [:name]]
]
]) do
add :id, :string, primary_key: true
add :name, :string, hash_key: true
end
end
def down do
drop_if_exists table(:rabbit)
end
# Migration file 3:
def up do
alter table(:post,
options: [
global_indexes: [
[index_name: "content",
keys: [:content],
create_if_not_exists: true,
provisioned_throughput: [1,1],
projection: [projection_type: :include, non_key_attributes: [:email]]]
]
]) do
add :content, string
end
end
def down do
alter table(:post,
options: [
global_indexes: [
[index_name: "content",
drop_if_exists: true]]
]
) do
remove :content
end
end
# Migration file 4:
def up do
alter table(:post) do
# modify will not be processed in a rollback if 'change' is used
modify :"email_content", :string, provisioned_throughput: [2,2]
remove :content
end
end
def down do
alter table(:post,
options: [
global_indexes: [
[index_name: "content",
keys: [:content],
projection: [projection_type: :include, non_key_attributes: [:email]]]
]
]) do
modify :"email_content", :string, provisioned_throughput: [100,100]
add :content, :string
end
end