Permalänk

Golang med ent. rest api

Hej Jag har skapat ett enkelt rest api med golang och mux.Jag vill nu koppla det med Sqlite och använda ent. Jag har försökt följa denna hemsidan men blir bara mer förvirrad.https://entgo.io/docs/crud#create-an-entity.Jag förstår klienten och hur det ska vara i func main men att lägga till i databasen känns förvirrande dem har använt detta som skall då spara en användare.

a8m, err := client.User. // UserClient.
Create(). // User create builder.
SetName("a8m"). // Set field value.
SetNillableAge(age). // Avoid nil checks.
AddGroups(g1, g2). // Add many edges.
SetSpouse(nati). // Set unique edge.
Save(ctx) // Create and return.

/*
// A struct for the domain structure,id is an int not UUID just to see if the rest api works.
// Have to look at time implementation but will do that after the database has been set up
type domain struct {
ID int `json:"id"`
Name string `json:"Name"`
Owner string `json:"owner"`
IPs string `json:"IPs"`
}

// An array of dummy domains to have data in insomnia before connecting to a database
var domains = []domain{
{ID: 1, Name: "example.com", Owner: "example", IPs: "192.168.1.1"},
{ID: 2, Name: "hello.com", Owner: "hello", IPs: "192.145.1.2"},
{ID: 3, Name: "bye.com", Owner: "bye", IPs: "192.199.1.3"},
}

// A function that returns the list of all domains and a http status ok
func returnAllDomains(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(domains)
}

// This function returns a domain by its id,first it return the route variable for the request
func returnDomainbyId(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
//Converts domain id into a string
domainId, err := strconv.Atoi(vars["id"])
if err != nil {
fmt.Println("unable to convert to string")
}
//Iterates over each of the domains in our range of domains
for _, domain := range domains {
//if the domains specific id is equal to the car id givin by the user
//it gets returned as a json object
if domain.ID == domainId {
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(domain)
}
}

}

// function that updates a domain by searching for its id
func updateDomainbyId(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
domainId, err := strconv.Atoi(vars["id"])

if err != nil {
fmt.Println("unable to convert to string")
}
//creates a new variable
var updatedDomain domain
//decodes the request body and the updated domain gets those values from insomnia.
json.NewDecoder(r.Body).Decode(&updatedDomain)

//loops through the array of domains
//if the id matches then the updated domain gets added to the end of the list of domains,
for k, d := range domains {
if d.ID == domainId {
domains = append(domains[:k], domains[k+1:]...)
domains = append(domains, updatedDomain)

}
}
//encodes the json information from insomnia into the list of domains
json.NewEncoder(w).Encode(domains)
w.WriteHeader(http.StatusOK)

}

// this function creates a new domain and adds it to the array of domains
func createDomain(w http.ResponseWriter, r *http.Request) {
var newDomain domain
//decodes the information from the request body and reads the json format
//sets the value of new car equal to the request body
json.NewDecoder(r.Body).Decode(&newDomain)
//adds the newDomain to the slice of domains
domains = append(domains, newDomain)
w.WriteHeader(http.StatusOK)
//Sends back the list of domains
json.NewEncoder(w).Encode(domains)

}

// A function that makes it possible to delete a domain by its id
func deleteDomainByID(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
domainId, err := strconv.Atoi(vars["id"])
if err != nil {
fmt.Println("unable to convert to string")
}
//Iterates over the list of domains and removes the selected domain.
for k, d := range domains {
if d.ID == domainId {

//Sets the domain array and sets it equal to the append function of domains
//up to the key we are currently on then it will append everything plus one after that removing anything inbetween
domains = append(domains[:k], domains[k+1:]...)
}
}

w.WriteHeader(http.StatusOK)
// sends back a new encoded list of domains
json.NewEncoder(w).Encode(domains)

}

func main() {
client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
if err != nil {
log.Fatal(err)
}
defer client.Close()
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/domains", returnAllDomains).Methods("GET")
router.HandleFunc("/domains/{id}", returnDomainbyId).Methods("GET")
router.HandleFunc("/domains/{id}", updateDomainbyId).Methods("PUT")
router.HandleFunc("/domains", createDomain).Methods("POST")
router.HandleFunc("/domains/{id}", deleteDomainByID).Methods("DELETE")

log.Fatal(http.ListenAndServe(":8080", router))
}
*/

Permalänk
Avstängd

Visa koden som kod, då det blir mycket lättare att läsa.

Vad har du själv gjort? Och försökt? Vilka fel får du?

Permalänk
Skrivet av TANDEMCYKELN:

Visa koden som kod, då det blir mycket lättare att läsa.

Vad har du själv gjort? Och försökt? Vilka fel får du?

Kan skapa en domain men får ett error i terminalen.Grafen skapas inte heller.Målet är att kunna göra alla crud operationer och koppla det till databasen(sqlite).
go run main.go
# command-line-arguments
ld: warning: -no_pie is deprecated when targeting new OS versions
2022/09/16 15:19:30 domain was created: Domain(id=1, name=example.com, owner=example)
2022/09/16 15:19:30 domain returned: Domain(id=1, name=example.com, owner=example)
2022/09/16 15:19:30 ent: constraint failed: UNIQUE constraint failed: domains.id
exit status 1

func main() { client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1") if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } defer client.Close() ctx := context.Background() // Run the auto migration tool. if err := client.Schema.Create(ctx); err != nil { log.Fatalf("failed creating schema resources: %v", err) } if _, err = CreateDomain(ctx, client); err != nil { log.Fatal(err) } if _, err = QueryDomain(ctx, client); err != nil { log.Fatal(err) } if err := CreateGraph(ctx, client); err != nil { log.Fatal(err) } } func CreateDomain(ctx context.Context, client *ent.Client) (*ent.Domain, error) { u, err := client.Domain. Create(). SetID(1). SetName("example.com"). SetOwner("example"). Save(ctx) if err != nil { return nil, fmt.Errorf("failed creating domain: %w", err) } log.Println("domain was created: ", u) return u, nil } func QueryDomain(ctx context.Context, client *ent.Client) (*ent.Domain, error) { u, err := client.Domain. Query(). Where(domain.ID(1)). // `Only` fails if no domain is found, // or more than 1 domain returned. Only(ctx) if err != nil { return nil, fmt.Errorf("failed querying domain: %w", err) } log.Println("domain returned: ", u) return u, nil } func CreateGraph(ctx context.Context, client *ent.Client) error { // First, create the domain. _, err := client.Domain. Create(). SetID(1). SetName("example.com"). SetOwner("Example"). Save(ctx) if err != nil { return err } _, err = client.Domain. Create(). SetID(1). SetName("exa.com"). SetOwner("Exa"). Save(ctx) if err != nil { return err } log.Println("The graph was created successfully") return nil }

Permalänk
Medlem

Ett unique constraint på en kolumn i en SQL-databas innebär att det inte får finnas flera rader i databastabellen med samma värde i den kolumnen. I det här fallet verkar det finns ett unique constraint på kolumnen id, Så om du anropar CreateDomain mer en än gång blir det inget bra, eftersom id 1 är hårdkodat.

Permalänk
Skrivet av ChristofferC:

Ett unique constraint på en kolumn i en SQL-databas innebär att det inte får finnas flera rader i databastabellen med samma värde i den kolumnen. I det här fallet verkar det finns ett unique constraint på kolumnen id, Så om du anropar CreateDomain mer en än gång blir det inget bra, eftersom id 1 är hårdkodat.

OKey men jag kallar den bara en gång när jag kör go run main.go i terminalen.Testade att ändra id i create graph functionen och nu får:
2022/09/19 14:02:53 domain was created: Domain(id=1, name=example.com, owner=example)
2022/09/19 14:02:53 domain returned: Domain(id=1, name=example.com, owner=example)
2022/09/19 14:02:53 The graph was created successfully

men hur kan jag se tabellen,vad skall jag skriva i terminalen för att se den?