select id,name,age from student where del_flag = 0用gorm怎么写
时间: 2023-05-21 18:04:50 浏览: 70
使用 GORM,可以这样写:
```
db.Where("del_flag = ?", 0).Select("id, name, age").Find(&students)
```
其中,`db` 是你的 GORM 数据库对象,`&students` 是存储查询结果的切片。
这条语句的含义是:从 `student` 表中选择 `id`、`name` 和 `age` 这三个字段,且 `del_flag` 等于 0 的记录,最后将结果映射到 `students` 切片中。
注意,这里的 `.Where()` 方法里使用了占位符 `?` 和参数 `0`,这是防止 SQL 注入的一种方式。如果你的参数是变量,可以这样写:
```
flag := 0
db.Where("del_flag = ?", flag).Select("id, name, age").Find(&students)
```
相关问题
select *from tokens where product_id = ''and owner_id = '' and status not in ('Miniting','Recycled') and contract_id =306,使用gorm表示以上sql
使用GORM表示以上SQL语句可以通过GORM的链式调用来实现。下面是一个示例代码:
```go
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Token struct {
ID int
ProductID string
OwnerID string
Status string
ContractID int
}
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println("Failed to connect to database:", err)
return
}
var tokens []Token
db.Where("product_id = ? AND owner_id = ? AND status NOT IN (?, ?) AND contract_id = ?",
"", "", "Miniting", "Recycled", 306).Find(&tokens)
fmt.Println("Tokens:", tokens)
}
```
在示例代码中,我们首先创建了一个`Token`结构体,用于映射数据库中的`tokens`表的行数据。然后,使用`gorm.Open`方法连接到MySQL数据库。
接下来,使用`db.Where`方法来构建查询条件,其中每个条件都对应SQL语句中的一个部分。我们使用`?`占位符来表示参数,然后在第二个参数中传递实际的参数值。
最后,使用`Find`方法执行查询,并将结果存储在`tokens`切片中。你可以根据实际情况修改查询条件和结构体定义来适应你的数据表结构。
改进代码var req []*Total res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE facility_id = ? "+ "UNION SELECT * FROM issues WHERE facility_id = ? "+ "UNION SELECT * FROM records WHERE facility_id = ? "+ "UNION SELECT * FROM qualities WHERE facility_id = ? "+ "UNION SELECT * FROM inspections WHERE facility_id = ?", code, code, code, code, code).Find(&req)
这段代码可以优化为使用GORM的联合查询(Union)功能,避免使用Raw SQL语句。
可以尝试这样改进代码:
```
err := db.Where("facility_id = ?", code).
Select("id, created_at, updated_at, field1, field2, NULL as field3, NULL as field4, NULL as field5").
Table("flaws").
Union(db.Where("facility_id = ?", code).
Select("id, created_at, updated_at, field1, NULL as field2, field3, field4, NULL as field5").
Table("issues")).
Union(db.Where("facility_id = ?", code).
Select("id, created_at, updated_at, field1, NULL as field2, NULL as field3, NULL as field4, field5").
Table("records")).
Union(db.Where("facility_id = ?", code).
Select("id, created_at, updated_at, field1, field2, NULL as field3, NULL as field4, NULL as field5").
Table("qualities")).
Union(db.Where("facility_id = ?", code).
Select("id, created_at, updated_at, field1, NULL as field2, field3, field4, field5").
Table("inspections")).
Order("created_at desc").
Limit(pageSize).
Offset((page - 1) * pageSize).
Find(&req).Error
```
在这个示例中,我们使用了 `Select` 函数选择每个表中的字段,并将不需要的字段设置为 `NULL`。然后我们使用 `Union` 函数将所有查询合并到一起,并使用 `Order`、`Limit` 和 `Offset` 函数进行分页和排序。
这种方法比使用 `Raw` 函数更安全,因为它可以防止 SQL 注入攻击,并且更易于维护。