Created
March 14, 2021 19:21
-
-
Save jquiterio/e0ea31f0642198dfa1d81de5d172dee8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"gorm.io/datatypes" | |
"gorm.io/driver/postgres" | |
"gorm.io/gorm" | |
) | |
type Planet struct { | |
ID uint `gorm:"primaryKey;autoIncrement"` | |
Name string `gorm:"unique;type:string;size:100"` | |
NumSatellites uint32 | |
Specs JSONMap // from https://gist.github.com/jquiterio/ef31f8640ebe2960a8fd3a0bcccd9689 | |
var db *gorm.DB | |
func init() { | |
var err error | |
dsn := "host=localhost user=medium dbname=medium port=5432 sslmode=disable" | |
if db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}); err != nil { | |
panic(err) | |
} | |
// automigrate table planets | |
db.AutoMigrate(&Planet{}) | |
} | |
func CreatePlanet() { | |
// declaring planet specs | |
earthSpecs := map[string]interface{}{ | |
"alt_name": "gaia", | |
"main_composition": []string{"nitrogen", "oxygen"}, | |
"others": map[string]interface{}{ | |
"is_nice": true, | |
"orbital_period_days": 365, | |
}, | |
} | |
marsSpecs := map[string]interface{}{ | |
"main_composition": []string{ | |
"carbon dioxide", | |
"argon", | |
"nitrogen", | |
"oxygen", | |
}, | |
"is_red": true, | |
"others": map[string]interface{}{ | |
"is_nice": "hum...", | |
"orbital_period_days": 686, | |
}, | |
} | |
jupiterSpecs := map[string]interface{}{ | |
"main_composition": []string{"hydrogen", "helium"}, | |
} | |
// creating Array of Planets | |
earth := Planet{Name: "Earth", NumSatellites: 1, Specs: JSONMap(earthSpecs)} | |
mars := Planet{Name: "Mars", NumSatellites: 2, Specs: JSONMap(marsSpecs)} | |
jupiter := Planet{Name: "Jupiter", NumSatellites: 79, Specs: JSONMap(jupiterSpecs)} | |
planets := []Planet{earth, mars, jupiter} | |
db.Debug().Create(&planets) | |
} | |
func GetPlanetsWithAltName() { | |
planets := []Planet{} | |
db.Debug().Find(&planets, datatypes.JSONQuery("specs").HasKey("alt_name")) | |
fmt.Printf("%+v", planets) | |
} | |
func GetPlanetByAltName(alt_name string) { | |
planets := []Planet{} | |
db.First(&planets, datatypes.JSONQuery("specs").Equals(alt_name, "alt_name")) | |
fmt.Printf("%+v", planets) | |
} | |
func GetPlanetsByComposition(composition string) { | |
planets := []Planet{} | |
db.Debug().Model(&Planet{}).Find(&planets, datatypes.JSONQuery("specs").HasKey("main_composition", composition)) | |
fmt.Printf("%+v", planets) | |
} | |
func GetAllPlanets() { | |
planets := []Planet{} | |
db.Find(&planets) | |
fmt.Printf("%+v", planets) | |
} | |
func UpdatePlanetByItsComposition(composition string) { | |
planets := []Planet{} | |
updatedPlanets := []Planet{} | |
db.Debug().Model(&Planet{}).Find(&planets, datatypes.JSONQuery("specs").HasKey("main_composition", composition)) | |
for _, planet := range planets { | |
specs := planet.Specs | |
specs["type"] = "cool!" | |
planet.Specs = JSONMap(specs) | |
db.Save(&planet) | |
} | |
db.Debug().Model(&Planet{}).Find(&updatedPlanets, datatypes.JSONQuery("specs").HasKey("type", "cool!")) | |
fmt.Printf("%+v", updatedPlanets) | |
} | |
func DeletePlanetWithoutAComposition(composition string) { | |
planets := []Planet{} | |
db.Not(datatypes.JSONQuery("specs").HasKey("main_composition", composition)).Find(&planets) | |
for _, planet := range planets { | |
db.Delete(&planet) | |
} | |
//double check | |
db.Find(&planets) | |
fmt.Printf("%+v", planets) | |
} | |
func main() { | |
CreatePlanet() | |
GetAllPlanets() | |
GetPlanetsWithAltName() | |
GetPlanetByAltName("gaia") | |
GetPlanetsByComposition("oxygen") | |
UpdatePlanetByItsComposition("oxygen") | |
DeletePlanetWithoutAComposition("oxygen") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment