121 lines
3.6 KiB
Go
121 lines
3.6 KiB
Go
// Copyright 2019-present Facebook Inc. All rights reserved.
|
|
// This source code is licensed under the Apache 2.0 license found
|
|
// in the LICENSE file in the root directory of this source tree.
|
|
|
|
//go:build migratedata_20221126185750
|
|
|
|
// Package migratedata holds the functions for generating data migration files.
|
|
// It exists here for documentation and reference purpose only and has no runtime
|
|
// effect on the actual migration files.
|
|
package migratedata
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"ariga.io/atlas/sql/migrate"
|
|
"entgo.io/ent/dialect"
|
|
"entgo.io/ent/dialect/sql"
|
|
"entgo.io/ent/dialect/sql/schema"
|
|
"entgo.io/ent/dialect/sql/sqljson"
|
|
"entgo.io/ent/examples/migration/ent"
|
|
"entgo.io/ent/examples/migration/ent/user"
|
|
)
|
|
|
|
// BackfillUserTags was used to generate the migration file '20221126185750_backfill_user_tags.sql'.
|
|
// It exists here for documentation purpose only, and can be used as a reference for future data migrations.
|
|
func BackfillUserTags(dir *migrate.LocalDir) error {
|
|
w := &schema.DirWriter{Dir: dir}
|
|
client := ent.NewClient(ent.Driver(schema.NewWriteDriver(dialect.MySQL, w)))
|
|
|
|
// Add defaults "foo" and "bar" tags for users without any.
|
|
err := client.User.
|
|
Update().
|
|
Where(func(s *sql.Selector) {
|
|
s.Where(
|
|
sql.Or(
|
|
sql.IsNull(user.FieldTags),
|
|
sqljson.ValueIsNull(user.FieldTags),
|
|
),
|
|
)
|
|
}).
|
|
SetTags([]string{"foo", "bar"}).
|
|
Exec(context.Background())
|
|
if err != nil {
|
|
return fmt.Errorf("failed generating backfill statement: %w", err)
|
|
}
|
|
// Document all changes until now with a custom comment.
|
|
w.Change("Backfill NULL or null tags with a default value.")
|
|
|
|
// Append the "org" special tag for users with a specific prefix or suffix.
|
|
err = client.User.
|
|
Update().
|
|
Where(
|
|
user.Or(
|
|
user.NameHasPrefix("org-"),
|
|
user.NameHasSuffix("-org"),
|
|
),
|
|
// Append to only those without this tag.
|
|
func(s *sql.Selector) {
|
|
s.Where(
|
|
sql.Not(sqljson.ValueContains(user.FieldTags, "org")),
|
|
)
|
|
},
|
|
).
|
|
AppendTags([]string{"org"}).
|
|
Exec(context.Background())
|
|
if err != nil {
|
|
return fmt.Errorf("failed generating backfill statement: %w", err)
|
|
}
|
|
// Document all changes until now with a custom comment.
|
|
w.Change("Append the 'org' tag for organization accounts in case they don't have it.")
|
|
|
|
// Write the content to the migration directory.
|
|
return w.Flush("backfill_user_tags")
|
|
}
|
|
|
|
// BackfillUnknown back-fills all empty users' names with the default value 'Unknown'.
|
|
func BackfillUnknown(dir *migrate.LocalDir) error {
|
|
w := &schema.DirWriter{Dir: dir}
|
|
client := ent.NewClient(ent.Driver(schema.NewWriteDriver(dialect.MySQL, w)))
|
|
|
|
// Change all empty names to 'unknown'.
|
|
err := client.User.
|
|
Update().
|
|
Where(
|
|
user.NameEQ(""),
|
|
).
|
|
SetName("Unknown").
|
|
Exec(context.Background())
|
|
if err != nil {
|
|
return fmt.Errorf("failed generating statement: %w", err)
|
|
}
|
|
|
|
// Write the content to the migration directory.
|
|
return w.FlushChange(
|
|
"unknown_names",
|
|
"Backfill all empty user names with default value 'unknown'.",
|
|
)
|
|
}
|
|
|
|
// SeedUsers add the initial users to the database.
|
|
func SeedUsers(dir *migrate.LocalDir) error {
|
|
w := &schema.DirWriter{Dir: dir}
|
|
client := ent.NewClient(ent.Driver(schema.NewWriteDriver(dialect.MySQL, w)))
|
|
|
|
// The statement that generates the INSERT statement.
|
|
err := client.User.CreateBulk(
|
|
client.User.Create().SetName("a8m").SetAge(1).SetTags([]string{"foo"}),
|
|
client.User.Create().SetName("nati").SetAge(1).SetTags([]string{"bar"}),
|
|
).Exec(context.Background())
|
|
if err != nil {
|
|
return fmt.Errorf("failed generating statement: %w", err)
|
|
}
|
|
|
|
// Write the content to the migration directory.
|
|
return w.FlushChange(
|
|
"seed_users",
|
|
"Add the initial users to the database.",
|
|
)
|
|
}
|