如何将 SQL 输出格式化为 JSON?

huangapple go评论125阅读模式
英文:

How to format sql output into json

问题

我有一个查询数据库并返回两列的Go函数:

  1. var colA string
  2. var colB string
  3. err = db.QueryRow("select colA, colB from table where colA = %v", 1).Scan(&colA,&colB)
  4. if err != nil {
  5. fmt.Printf(err.Error())
  6. }
  7. fmt.Println(colA,colB)
  8. return nil

我想以JSON格式返回输出,例如{colA:colB}。我尝试使用json.Marshal函数,但无法正确运行。

英文:

I have a Go function that queries a database and returns two columns:

  1. var colA string
  2. var colB string
  3. err = db.QueryRow("select colA, colB from table where colA = %v", 1).Scan(&colA,&colB)
  4. if err != nil {
  5. fmt.Printf(err.Error())
  6. }
  7. fmt.Println(colA,colB)
  8. return nil

I would like to return the output in json format like {colA:colB}. I have played around with the json.Marshal function but can't get it working correctly.

答案1

得分: 1

你可以使用结构体来定义数据的结构,例如:

  1. type User struct {
  2. Username string `json:"username"`
  3. Email string `json:"email"`
  4. }

然后在查询时使用该结构体:

  1. user := User{}
  2. err = db.QueryRow("select colA, colB from table where colA = %v", 1).Scan(&user.Username, &user.Email)
  3. if err != nil {
  4. fmt.Printf(err.Error())
  5. }

之后可以调用json.Marshal将其转换为JSON字符串:

  1. msg, err := json.Marshal(user)
  2. if err != nil {
  3. log.Println(err)
  4. }
  5. fmt.Println(string(msg)) // "{\"username\":\"Blah\",\"email\":\"asd@asd.com\"}"

另外,如果你在调用Marshal时使用的是一个结构体,那么结构体的字段必须是可导出的,即字段名的首字母必须大写,才能被json.Marshal处理。

关于json.Marshal的更多信息,你可以参考官方文档:https://golang.org/pkg/encoding/json/#Marshal

英文:

You could make a struct if you know what your data is going to be: e.g

  1. type User struct {
  2. Username string `json:"username"`
  3. Email string `json:"email"`
  4. }

Then on your query:

  1. user := User{}
  2. err = db.QueryRow("select colA, colB from table where colA = %v", 1).Scan(&user.Username,&user.Email)
  3. if err != nil {
  4. fmt.Printf(err.Error())
  5. }

Then call marshal on it

  1. msg, err := json.Marshal(user)
  2. if err != nil {
  3. log.Println(err)
  4. }
  5. fmt.Println(string(msg)) // "{ "username": "Blah", "email": "asd@asd.com" }"

Also with the json.Marshal package if you're calling Marshal on a struct your fields MUST be exported by using a capital first letter on the field name, e.g. Username

> // Field is ignored by this package. Field int json:"-"
>
> // Field appears in JSON as key "myName". Field int json:"myName"
>
> // Field appears in JSON as key "myName" and // the field is omitted
> from the object if its value is empty, // as defined above. Field int
> json:"myName,omitempty"
>
> // Field appears in JSON as key "Field" (the default), but // the
> field is skipped if empty. // Note the leading comma. Field int
> json:",omitempty"

https://golang.org/pkg/encoding/json/#Marshal

答案2

得分: 0

你可以创建一个只有一个元素的映射,并将其编组:

  1. m := map[string]string{colA: colB}
  2. b, err := json.Marshal(m)

完整示例:https://play.golang.org/p/ntT5h3oHvY

英文:

You can create a one element map and marshal it:

  1. m := map[string]string{colA: colB}
  2. b, err := json.Marshal(m)

Full example: https://play.golang.org/p/ntT5h3oHvY

答案3

得分: 0

我建议你研究一些数据库管理框架。

我个人使用gorm (github.com/jinzhu/gorm) 来满足我的数据库需求。它具有使用结构体自动创建数据库并解析的功能。

你可以配合 "encoding/json" 包将数据转换为json格式并存入数据库,或者从数据库中取出并转换为json格式。

以下是一些你可以参考的个人代码:

结构体

  1. type Application struct {
  2. Id int64 `json:"id"`
  3. UserID int64 `sql:"not null;" json:"user_id"`
  4. Name string `sql:"size:255; not null; unique;" json:"name"`
  5. ExposedPorts string `json:"exposed_ports"` //docker
  6. DockerImage string `sql:"size:255; not null;" json:"docker_image"`
  7. Dependencies string `json:"dependencies"`
  8. IsEnabled bool `sql:"default:true" json:"is_enabled"`

}

JSON:

  1. func (a *Application) GetJSON() (string, error) {
  2. b, err := json.Marshal(a)
  3. if err != nil {
  4. logging.Log(err)
  5. return "",err;
  6. }
  7. return string(b),err;
  8. }

数据库

  1. //获取应用程序信息
  2. func GetApplication(id int64) (*models.Application, error) {
  3. app := &models.Application{}
  4. err := db.Where(&models.Application{Id: id}).First(&app).Error
  5. return app, err
  6. }
  7. func GetApplications() ([]models.Application, error) {
  8. //返回所有应用程序的列表
  9. apps := []models.Application{}
  10. err := db.Find(&apps).Error
  11. return apps, err
  12. }
  13. //从数据库中删除应用程序
  14. func DeleteApplication(id int64) (bool, error) {
  15. logging.Log("Deleting Application: ", id)
  16. app := models.Application{}
  17. err := db.Where(&models.Application{Id: id}).First(&app).Error
  18. if err != nil {
  19. return false, err
  20. }
  21. // TODO: 检查权限
  22. // 删除所有容器
  23. //从数据库中删除应用程序
  24. err = db.Delete(&app).Error
  25. if err != nil {
  26. return false, err
  27. }
  28. return true, err
  29. }
  30. //更新应用程序
  31. func UpdateApplication(app *models.Application) (bool, error) {
  32. newapp := models.Application{}
  33. err := db.Where(&models.Application{Id: app.Id}).First(&newapp).Error
  34. if err != nil {
  35. return false, err
  36. }
  37. err = db.Save(&app).Error
  38. if err != nil {
  39. return false, err
  40. }
  41. return true, nil
  42. }

希望对你有所帮助 如何将 SQL 输出格式化为 JSON?

英文:

I'd suggest looking into some database management frameworks.

I personally use gorm (github.com/jinzhu/gorm) for my database needs. It has functionality for automatically creating your database using structs and parsing them back out again.

You can pair that with the "encoding/json" package to take it to/from json to/from your database.

Here's some personal code you can use for reference:

Struct:

  1. type Application struct {
  2. Id int64 `json:"id"`
  3. UserID int64 `sql:"not null;" json:"user_id"`
  4. Name string `sql:"size:255; not null; unique;" json:"name"`
  5. ExposedPorts string `json:"exposed_ports"` //docker
  6. DockerImage string `sql:"size:255; not null;" json:"docker_image"`
  7. Dependencies string `json:"dependencies"`
  8. IsEnabled bool `sql:"default:true" json:"is_enabled"`

}

JSON:

  1. func (a *Application) GetJSON() (string, error) {
  2. b, err := json.Marshal(a)
  3. if err != nil {
  4. logging.Log(err)
  5. return "",err;
  6. }
  7. return string(b),err;
  8. }

Database

  1. //Get application information
  2. func GetApplication(id int64) (*models.Application, error) {
  3. app := &models.Application{}
  4. err := db.Where(&models.Application{Id: id}).First(&app).Error
  5. return app, err
  6. }
  7. func GetApplications() ([]models.Application, error) {
  8. //Returns a list of all applications
  9. apps := []models.Application{}
  10. err := db.Find(&apps).Error
  11. return apps, err
  12. }
  13. //delete application from database
  14. func DeleteApplication(id int64) (bool, error) {
  15. logging.Log("Deleting Application: ", id)
  16. app := models.Application{}
  17. err := db.Where(&models.Application{Id: id}).First(&app).Error
  18. if err != nil {
  19. return false, err
  20. }
  21. // TODO: Check for auth
  22. // Delete all containers
  23. //Delete application from database
  24. err = db.Delete(&app).Error
  25. if err != nil {
  26. return false, err
  27. }
  28. return true, err
  29. }
  30. //Update Application
  31. func UpdateApplication(app *models.Application) (bool, error) {
  32. newapp := models.Application{}
  33. err := db.Where(&models.Application{Id: app.Id}).First(&newapp).Error
  34. if err != nil {
  35. return false, err
  36. }
  37. err = db.Save(&app).Error
  38. if err != nil {
  39. return false, err
  40. }
  41. return true, nil
  42. }

Hope this helps 如何将 SQL 输出格式化为 JSON?

答案4

得分: 0

这是一个完整的示例:

campaign.model.go:

  1. package models
  2. import "database/sql"
  3. // Campaign Model
  4. type Campaign struct {
  5. CampaignId int `db:"campaign_id" json:"campaignId"`
  6. CampaignNme string `db:"campaign_nme" json:"campaignNme"`
  7. OrganizationId sql.NullInt64 `db:"organization_id" json:"organizationId"`
  8. }

campaign.repository.go:

  1. package repositories
  2. import (
  3. "github.com/jmoiron/sqlx"
  4. "go-clean-arch/domain/models"
  5. "go-clean-arch/domain/repositories"
  6. )
  7. type CampaignRepository struct {
  8. Db *sqlx.DB
  9. }
  10. func NewCampaignRepository(Db *sqlx.DB) repositories.CampaignRepository {
  11. return &CampaignRepository{Db}
  12. }
  13. func (cr *CampaignRepository) FindById(id string) (models.Campaign, error) {
  14. campaign := models.Campaign{}
  15. query := `
  16. SELECT
  17. campaign_id,
  18. campaign_nme,
  19. organization_id
  20. FROM "CAMPAIGN" WHERE campaign_id = $1
  21. `
  22. err := cr.Db.Get(&campaign, query, id)
  23. if err != nil {
  24. return campaign, err
  25. }
  26. return campaign, nil
  27. }

main.go:

  1. func main() {
  2. dbConf := database.PGDatabaseConfig{
  3. Host: viper.GetString("SQL_HOST"),
  4. Port: viper.GetString("SQL_PORT"),
  5. User: viper.GetString("SQL_USER"),
  6. Password: viper.GetString("SQL_PASSWORD"),
  7. Dbname: viper.GetString("SQL_DB"),
  8. }
  9. db, err := database.ConnectPGDatabase(&dbConf)
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. defer func() {
  14. if err := recover(); err != nil {
  15. fmt.Println(err)
  16. }
  17. }()
  18. //userRepository := repositories.NewUserRepository(db)
  19. //users, _ := userRepository.FindAll()
  20. //fmt.Printf("%#v", &users)
  21. campaignRepository := repositories.NewCampaignRepository(db)
  22. campaign, err := campaignRepository.FindById("102")
  23. if err != nil {
  24. panic(err)
  25. }
  26. fmt.Printf("%#v", campaign)
  27. campaignJSON, err := json.Marshal(campaign)
  28. if err != nil {
  29. panic(err)
  30. }
  31. fmt.Println(string(campaignJSON))
  32. }

输出:

  1. go-clean-arch [master] go run main.go
  2. models.Campaign{CampaignId:102, CampaignNme:"Generic Party / Memories", OrganizationId:sql.NullInt64{Int64:0, Valid:false}}
  3. campaignJSON: {"campaignId":102,"campaignNme":"Generic Party / Memories","organizationId":{"Int64":0,"Valid":false}}
英文:

Here is a completely sample:

campaign.model.go:

  1. package models
  2. import "database/sql"
  3. // Campaign Model
  4. type Campaign struct {
  5. CampaignId int `db:"campaign_id" json:"campaignId"`
  6. CampaignNme string `db:"campaign_nme" json:"campaignNme"`
  7. OrganizationId sql.NullInt64 `db:"organization_id" json:"organizationId"`
  8. }

campaign.repository.go:

  1. package repositories
  2. import (
  3. "github.com/jmoiron/sqlx"
  4. "go-clean-arch/domain/models"
  5. "go-clean-arch/domain/repositories"
  6. )
  7. type CampaignRepository struct {
  8. Db *sqlx.DB
  9. }
  10. func NewCampaignRepository(Db *sqlx.DB) repositories.CampaignRepository {
  11. return &CampaignRepository{Db}
  12. }
  13. func (cr *CampaignRepository)FindById(id string) (models.Campaign, error) {
  14. campaign := models.Campaign{}
  15. query := `
  16. SELECT
  17. campaign_id,
  18. campaign_nme,
  19. organization_id
  20. FROM "CAMPAIGN" WHERE campaign_id = $1
  21. `
  22. err := cr.Db.Get(&campaign, query, id)
  23. if err != nil {
  24. return campaign, err
  25. }
  26. return campaign, nil
  27. }

main.go:

  1. func main() {
  2. dbConf := database.PGDatabaseConfig{
  3. Host: viper.GetString("SQL_HOST"),
  4. Port: viper.GetString("SQL_PORT"),
  5. User: viper.GetString("SQL_USER"),
  6. Password: viper.GetString("SQL_PASSWORD"),
  7. Dbname: viper.GetString("SQL_DB"),
  8. }
  9. db, err := database.ConnectPGDatabase(&dbConf)
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. defer func () {
  14. if err := recover(); err != nil {
  15. fmt.Println(err)
  16. }
  17. }()
  18. //userRepository := repositories.NewUserRepository(db)
  19. //users, _ := userRepository.FindAll()
  20. //fmt.Printf("%#v", &users)
  21. campaignRepository := repositories.NewCampaignRepository(db)
  22. campaign, err := campaignRepository.FindById("102")
  23. if err != nil {
  24. panic(err)
  25. }
  26. fmt.Printf("%#v", campaign)
  27. campaignJSON, err := json.Marshal(campaign)
  28. if err != nil {
  29. panic(err)
  30. }
  31. fmt.Println(string(campaignJSON))
  32. }

Output:

  1. go-clean-arch [master] go run main.go
  2. models.Campaign{CampaignId:102, CampaignNme:"Generic Party / Memories", OrganizationId:sql.NullInt64{Int64:0, Valid:false}}
  3. campaignJSON: {"campaignId":102,"campaignNme":"Generic Party / Memories","organizationId":{"Int64":0,"Valid":false}}

huangapple
  • 本文由 发表于 2016年1月4日 10:57:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/34584126.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定