zoukankan      html  css  js  c++  java
  • ent 基本使用十 数据库迁移

    ent 提供了便捷的数据库迁移处理,我们可以直接使用生成的代码进行操作,同时代码也提供了比较全的运行选项

    默认迁移处理

    我们通过create 进行资源创建,默认是append-only 模式 ,以为着只会创建新的表以及索引 ,同时添加列到表,或者
    扩展现有列的数据类型

     
    if err := client.Schema.Create(ctx); err != nil {
        log.Fatalf("failed creating schema resources: %v", err)
    }
     

    删除资源模式

    通过WithDropIndex(true), WithDropColumn(true), 我们可以删除不需要的列以及索引。

    package main
    import (
        "context"
        "log"
        "<project>/ent"
        "<project>/ent/migrate"
    )
    func main() {
        client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
        if err != nil {
            log.Fatalf("failed connecting to mysql: %v", err)
        }
        defer client.Close()
        ctx := context.Background()
        // Run migration.
        err = client.Schema.Create(
            ctx, 
            migrate.WithDropIndex(true),
            migrate.WithDropColumn(true), 
        )
        if err != nil {
            log.Fatalf("failed creating schema resources: %v", err)
        }
    }
     
     

    为了方便查看生成的sql 我们可以通过debug 模式

    err := client.Debug().Schema.Create(
        ctx, 
        migrate.WithDropIndex(true),
        migrate.WithDropColumn(true),
    )
    if err != nil {
        log.Fatalf("failed creating schema resources: %v", err)
    }
     
     

    通用id

    默认每张表的sql 主键是从 1开始的,以为不同类型的多个实体可以共享共一个id,但是像 AWS Neptune, 边IDs 是uuid
    这种同时也不能很好的和graphql 工作,因为每个对象需要一个唯一的 id,为了启动唯一id,我们可以通过WithGlobalUniqueID
    选项,如下:

    package main
    import (
        "context"
        "log"
        "<project>/ent"
        "<project>/ent/migrate"
    )
    func main() {
        client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
        if err != nil {
            log.Fatalf("failed connecting to mysql: %v", err)
        }
        defer client.Close()
        ctx := context.Background()
        // Run migration.
        if err := client.Schema.Create(ctx, migrate.WithGlobalUniqueID(true)); err != nil {
            log.Fatalf("failed creating schema resources: %v", err)
        }
    }
     
     

    原理 :
    ent 分配了不同实体表的id 在1<<32 同时存储id 在信息表ent_types 中 ,比如 A [1,4294967296)
    B [4294967296,8589934592) 如果启用这个选项最大的表为65536

    离线模式

    离线模式可以方便我们审计生成的sql

    • 输出标准输出
     
    package main
    import (
        "context"
        "log"
        "os"
        "<project>/ent"
        "<project>/ent/migrate"
    )
    func main() {
        client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
        if err != nil {
            log.Fatalf("failed connecting to mysql: %v", err)
        }
        defer client.Close()
        ctx := context.Background()
        // Dump migration changes to stdout.
        if err := client.Schema.WriteTo(ctx, os.Stdout); err != nil {
            log.Fatalf("failed printing schema changes: %v", err)
        }
    }
     
    • 输出到文件
    package main
    import (
        "context"
        "log"
        "os"
        "<project>/ent"
        "<project>/ent/migrate"
    )
    func main() {
        client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
        if err != nil {
            log.Fatalf("failed connecting to mysql: %v", err)
        }
        defer client.Close()
        ctx := context.Background()
        // Dump migration changes to an SQL script.
        f, err := os.Create("migrate.sql")
        if err != nil {
            log.Fatalf("create migrate file: %v", err)
        }
        defer f.Close()
        if err := client.Schema.WriteTo(ctx, f); err != nil {
            log.Fatalf("failed printing schema changes: %v", err)
        }
    }

    参考资料

    https://entgo.io/docs/migrate/

  • 相关阅读:
    ASP.NET CORE中控制器内return HTML 内容自动编码问题
    sql server中调用c#写的dll里的方法
    牛腩视频播放管理系统
    apicloud开发笔记
    asp.net core在linux上的部署调试
    C#-微信公众平台接口-上传临时素材
    csc.exe已退出,代码为-532462766
    牛腩记账本core版本源码
    sql server中根据地图经纬度算距离
    ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署)
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/11675537.html
Copyright © 2011-2022 走看看