I have 2 structs one Company the other Service. They have a has-many
relationship company to service. I'm trying to write an SQL query that will insert a company and multiple services attached to that company in one query.
RAW SQL:
WITH company AS ( INSERT INTO companies(id, name) VALUES('1', 'acme') RETURNING id)
INSERT INTO services(id, company_id, name) VALUES
('1', (select company.id from company), 'cool service'),
('2', (select company.id from company), 'cooler service');
I'm trying to imitate this using go's sql package. This is my attempt thus far: I've added the structs at the top just for clarity
c := &Company{
ID: uuid.NewV4().String(),
Name: "test comp",
}
s := []*Service{
&Service{
ID: uuid.NewV4().String(),
CompanyID: c.ID,
Name: "test svc",
},
}
c.Service = s
values := []interface{}{
c.ID,
c.Name,
}
q := `
WITH company as (INSERT INTO companies(id, name) VALUES ($1, $2)) INSERT INTO services(id, company_id, name) VALUES
`
for _, row := range c.Services {
q += "($1, $2, $3),"
values = append(values, row.ID, row.CompanyID)
}
q = strings.TrimSuffix(q, ",")
stmt, err := s.DB.Prepare(q)
if err != nil {
return err
}
if _, err := stmt.Exec(values...); err != nil {
return err
}
I'm not sure how else to go about this but with this method I get this error:
ERROR #08P01 bind message supplies 5 parameters, but prepared statement "1" requires 3
Which makes sense I'm passing 5 parameters to exec when prepared statement "1" which I'm guessing is the second one only requires 3. But how can I perform my query without having to split it up into more than 1 query?