Delete

Bob を使用した SQLite の DELETE クエリの例を示します。

基本的な DELETE

DELETE FROM users WHERE id = ?
sqlite.Delete("users").
    Where(sqlite.Quote("id").EQ(sqlite.Arg(1)))

複数条件での DELETE

DELETE FROM users 
WHERE active = ? AND created_at < ?
sqlite.Delete("users").
    Where(
        sqlite.Quote("active").EQ(sqlite.Arg(false)),
        sqlite.Quote("created_at").LT(sqlite.Arg(time.Now().AddDate(0, -1, 0))),
    )

JOIN を使用した DELETE

DELETE FROM users 
WHERE id IN (
    SELECT u.id FROM users u
    JOIN user_profiles p ON u.id = p.user_id
    WHERE p.status = ?
)
subquery := sqlite.Select(sqlite.Quote("u", "id")).
    From("users").As("u").
    Join("user_profiles").As("p").
    On(sqlite.Quote("u", "id").EQ(sqlite.Quote("p", "user_id"))).
    Where(sqlite.Quote("p", "status").EQ(sqlite.Arg("inactive")))

sqlite.Delete("users").
    Where(sqlite.Quote("id").In(subquery))

LIMIT 付きの DELETE

DELETE FROM logs 
WHERE created_at < ?
ORDER BY created_at ASC
LIMIT ?
sqlite.Delete("logs").
    Where(sqlite.Quote("created_at").LT(sqlite.Arg(time.Now().AddDate(0, -1, 0)))).
    OrderBy(sqlite.Quote("created_at").Asc()).
    Limit(1000)

IN 句を使用した DELETE

DELETE FROM users WHERE id IN (?, ?, ?)
sqlite.Delete("users").
    Where(sqlite.Quote("id").In(sqlite.Arg(1), sqlite.Arg(2), sqlite.Arg(3)))

サブクエリを使用した DELETE

DELETE FROM users 
WHERE id IN (
    SELECT user_id FROM user_sessions 
    WHERE last_activity < ?
)
subquery := sqlite.Select("user_id").
    From("user_sessions").
    Where(sqlite.Quote("last_activity").LT(sqlite.Arg(time.Now().AddDate(0, -1, 0))))

sqlite.Delete("users").
    Where(sqlite.Quote("id").In(subquery))

RETURNING 句(SQLite 3.35+)

DELETE FROM users 
WHERE id = ? 
RETURNING id, name, email
sqlite.Delete("users").
    Where(sqlite.Quote("id").EQ(sqlite.Arg(1))).
    Returning("id", "name", "email")

条件付きの一括削除

DELETE FROM audit_logs 
WHERE created_at < ? 
  AND level = 'DEBUG'
ORDER BY created_at ASC
LIMIT ?
sqlite.Delete("audit_logs").
    Where(
        sqlite.Quote("created_at").LT(sqlite.Arg(time.Now().AddDate(0, -3, 0))),
        sqlite.Quote("level").EQ(sqlite.Arg("DEBUG")),
    ).
    OrderBy(sqlite.Quote("created_at").Asc()).
    Limit(10000)

外部キー制約を考慮した DELETE

PRAGMA foreign_keys = ON;
DELETE FROM users WHERE id = ?
// 外部キー制約を有効にする
sqlite.Raw("PRAGMA foreign_keys = ON")

// 削除実行
sqlite.Delete("users").
    Where(sqlite.Quote("id").EQ(sqlite.Arg(1)))

条件に基づく CASCADE 削除

DELETE FROM posts 
WHERE user_id IN (
    SELECT id FROM users WHERE active = ?
)
inactiveUsers := sqlite.Select("id").
    From("users").
    Where(sqlite.Quote("active").EQ(sqlite.Arg(false)))

sqlite.Delete("posts").
    Where(sqlite.Quote("user_id").In(inactiveUsers))

これらの例は、Bob を使用して SQLite で実行可能な様々な DELETE クエリパターンを示しています。