Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sqlx中读取外键_Sql_Database_Go_Sqlx - Fatal编程技术网

如何在sqlx中读取外键

如何在sqlx中读取外键,sql,database,go,sqlx,Sql,Database,Go,Sqlx,在我的数据库中,我有几个表: 团队 | Field | Type | | ----- | ------- | | ID | int | | Name | varchar | 固定装置 | Field | Type | | ----- | ---- | | ID | int | | Home | int | | Away | int | 很明显,Home和Away列是Teams的外键 在Go中,我将其定义为以下类型: 类型团队结构{ ID int64`js

在我的数据库中,我有几个表:

团队

| Field | Type    |
| ----- | ------- |
| ID    | int     |
| Name  | varchar |
固定装置

| Field | Type |
| ----- | ---- |
| ID    | int  |
| Home  | int  |
| Away  | int  |
很明显,
Home
Away
列是
Team
s的外键

在Go中,我将其定义为以下类型:

类型团队结构{
ID int64`json:“ID”db:“ID”`
名称字符串`json:“Name”db:“Name”`
}
类型夹具结构{
ID int64`json:“ID”db:“ID”`
Home int64`json:“Home”db:“Home”`
Away int64`json:“Away”db:“Away”`
}
我希望能够从数据库中读取一段装置,比如:

var fs[]夹具
err:=sqlx.DB.SelectContext(ctx,&fs,`SELECT*FROM fixture`)
但这会导致一个错误:

Scan error on column index 2, name "home": unsupported Scan, storing driver.Value type int64 into type *teams.Team
我在这里读过关于嵌入的内容,但看不出这有什么帮助,因为
Home
Away
都属于同一类型,因此会有命名冲突


非常感谢任何帮助

首先,无法直接执行此操作,例如,在struct
Y
上声明一些类型为
X
的字段,并让数据库驱动程序自动反序列化它们,因为两端的数据模型根本不同:数据库是关系型的(假设这是因为您使用的是sqlx)和Go是面向对象的结构。因此这将是ORM(对象关系映射,因此得名)的工作。但是假设您现在还不想使用ORM

其次,不管现有的FK约束如何,您使用的SQL查询只返回
fixture
表中的数据。它不会神奇地返回其他数据。因此,您要么查询数据库两次,要么必须
连接这两个表:

选择
f、 身份证,
t1.id作为主队id,
t1.name作为主队名称,
t2.id作为客场团队id,
t2.客场球队名称
从…起
夹具f
在t1.id=f.home上加入t1团队
在t2.id=f时加入t2队
请注意带有
as
的别名,这有助于区分列名。这将返回必要的数据字段。现在,您可以使用第三个桥接结构正确扫描从数据库获取的行,并使用它初始化主结构:

//这里我使用(一部分)匿名结构,
//但是您可以声明一个命名的。
桥:=[]结构{
FixtureId int64`db:“id”`
HomeTeamId int64`db:“home\u team\u id”`
HomeTeamName字符串`db:“home\u team\u name”`
AwayTeamId int64`db:“客场团队id”`
AwayTeamName字符串`db:“客场团队名称”`
}{}
err:=db.SelectContext(ctx,&bridge,查询)
如果错误!=零{
//处理错误。。。
}
mystructs:=制造([]夹具,透镜(桥接))
对于i,b:=范围桥{
mystructs[i]=Fixture{
ID:b.FixtureId,
主队:球队{
ID:b.HomeTeamId,
姓名:b.HomeTeamName,
},
客场:球队{
ID:b.AwayTeamId,
姓名:b.AwayTeamName,
},
}
}
其他不太方便的替代方案有:

  • 使用
    sqlx.Queryx(ctx,query)
    获取
    *sqlx.Rows
    结果,并对其进行迭代,初始化
    Fixture
    结构。(完成后记得关闭
    ,以释放资源)
  • 让父结构
    Fixture
    实现
    sql.Scanner
    ()

太棒了,感谢您的详细回复。因此我想
gorm
是我将用作ORM的类型吗?@mbamber当然是可行的,但如果您的用例不是很复杂,我建议您选择一个更简单的解决方案开始。设置和学习如何使用
gorm
可能会花费更多的开销。YMMV.如果您选择了
gorm
,您可以使用标签
go gorm
查找有关stackoverflow的问题。