簡體   English   中英

PostgreSQL插入多個表和行

[英]PostgreSQL inserting multiple tables and rows

我有2個結構,一個公司,另一個服務。 他們有has-many關系公司要服務。 我正在嘗試編寫一個SQL查詢,該查詢將在一個查詢中插入公司和附加到該公司的多個服務。

原始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');

我正在嘗試使用go的sql包來模仿它。 到目前為止,這是我的嘗試:為了清楚起見,我在頂部添加了結構

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
}

我不確定該如何處理,但是使用這種方法會出現以下錯誤:

ERROR #08P01 bind message supplies 5 parameters, but prepared statement "1" requires 3

當准備好的語句“ 1”(我猜是第二個)僅需要3時,我將5個參數傳遞給exec是有意義的。但是如何執行我的查詢而不必將其拆分為多個查詢?

就像您的錯誤消息所述,您的SQL語句僅使用3個綁定變量:

   WITH company as (INSERT INTO companies(id, name) VALUES ($1, $2)) INSERT INTO services(id, company_id, name) VALUES

和:

    q += "($1, $2, $3),"

您只需為每個行重復$1$2$3 因此,您構造的查詢將類似於:

WITH company as (INSERT INTO companies(id, name) VALUES ($1, $2)) INSERT INTO services(id, company_id, name) VALUES
($1, $2, $3),($1, $2, $3),($1, $2, $3),($1, $2, $3),

顯然,這不是您想要的。 您需要在循環中的每次迭代中增加綁定變量編號。

我的方法可能是這樣的:

var i int = 3
for _, row := range c.Services {
    q += fmt.Sprintf("($%d, $%d, $%d),", i, i+1, i+2)
    values = append(values, row.ID, row.CompanyID)
    i += 3
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM