entgo里的表外键怎么写 详细解释 并写代码例子
时间: 2024-03-30 08:33:15 浏览: 220
在 Entgo 中,可以使用 `edge.To` 方法来声明一个表之间的外键关系。具体的用法是,通过指定目标表的模型类型和外键名称,来创建一个指向目标表的外键。下面是一个示例代码:
```go
package main
import (
"context"
"fmt"
"github.com/facebook/ent"
"github.com/facebook/ent/dialect"
"github.com/facebook/ent/schema/edge"
"github.com/facebook/ent/schema/field"
_ "github.com/mattn/go-sqlite3"
)
// 定义 User 模型
type User struct {
ent.Schema
}
// 在 User 模型中定义字段
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
field.Int("age"),
}
}
// 定义 Blog 模型
type Blog struct {
ent.Schema
}
// 在 Blog 模型中定义字段和外键
func (Blog) Fields() []ent.Field {
return []ent.Field{
field.String("title"),
field.String("content"),
}
}
// 在 Blog 模型中定义外键,指向 User 表
func (Blog) Edges() []ent.Edge {
return []ent.Edge{
edge.To("author", User.Type).Required(),
}
}
func main() {
// 连接数据库
client, err := ent.Open(dialect.SQLite, "file:ent?mode=memory&cache=shared&_fk=1")
if err != nil {
panic(err)
}
defer client.Close()
// 运行数据迁移
if err := client.Schema.Create(context.Background()); err != nil {
panic(err)
}
// 创建一个 User 实例
user := client.User.
Create().
SetName("Alice").
SetAge(20).
SaveX(context.Background())
// 创建一个 Blog 实例,指定 author 外键为 user
blog := client.Blog.
Create().
SetTitle("My first blog").
SetContent("Hello, world!").
SetAuthor(user).
SaveX(context.Background())
// 通过作者查询博客
blogs, err := client.User.
Query().
Where(user.QueryBlogs().All()).
WithBlogs().
All(context.Background())
if err != nil {
panic(err)
}
fmt.Println(blogs[0].Blogs)
}
```
在上面的代码中,我们定义了两个模型:`User` 和 `Blog`。`Blog` 模型中有一个外键 `author`,指向 `User` 表。在创建 `Blog` 实例时,我们将 `author` 外键设置为一个已经存在的 `User` 实例。
在使用外键查询时,我们可以通过 `QueryBlogs` 方法查询 `User` 所有的文章,并通过 `WithBlogs` 方法加载这些文章的详细信息。
阅读全文