2015-08-23 3 views
0

Первоначально я думал, что это проблема геройки, поскольку по какой-то странной причине этот код работает нормально локально, но при дальнейшем исследовании я понял, что id все время возвращался. По сути, я пытаюсь закодировать upsert, который возвращает id. Я работаю в библиотеке sql.Upsert postgresql return id

-- ---------------------------- 
-- Table structure for books 
-- ---------------------------- 
DROP TABLE IF EXISTS "public"."books" CASCADE; 
CREATE TABLE "public"."books" (
    "id" serial primary key, 
    "title" varchar(255) NOT NULL COLLATE "default", 
    "first" varchar(40) NOT NULL COLLATE "default", 
    "last" varchar(40) NOT NULL COLLATE "default", 
    "class" varchar(40) NOT NULL COLLATE "default" 
) 
WITH (OIDS=FALSE); 
-- ---------------------------- 
-- Table structure for bookitems 
-- ---------------------------- 
DROP TABLE IF EXISTS "public"."bookitem"; 
CREATE TABLE "public"."bookitem" (

    "id" serial primary key, 
    "price" int NOT NULL, 
    "condition" int NOT NULL, 
    "views" int NOT NULL, 
    "seller" bigint NOT NULL, 
    "book" int REFERENCES books(id), 
    "saletype" int NOT NULL, 
    "date" bigint NOT NULL, 
    "description" varchar(255) NOT NULL COLLATE "default", 
    "bucket" int NOT NULL, 
    "status" int NOT NULL --This is for showing what the staus of the item is (bought sold etc.) 
    --FOREIGN KEY (book) REFERENCES books(id) 
) 
WITH (OIDS=FALSE); 

Вот код, который вызывает ошибку:

rows, err := db.Query(`with vals as (
     select $1::VARCHAR as title, $2::VARCHAR as first, $3::VARCHAR as last, $4::VARCHAR as class 
    ) 
    insert into books (title, first, last, class) 
    select v.title, v.first, v.last, v.class 
    from vals as v 
    where not exists (select * from books as t where t.title = v.title and t.last = v.last and t.first = v.first and t.class = v.class) 
    RETURNING id`, r.FormValue("title"), 
      r.FormValue("first"), 
      r.FormValue("last"), 
      r.FormValue("class")) 
     //defer rows.Close() 
     rows.Scan(&id) 

     PanicIf(err) 

     _, err = db.Query("INSERT INTO bookitem (price, condition, views, seller, book, saletype, date, description, bucket, status) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)", 
      r.FormValue("price"), 
      r.FormValue("condition"), 
      0, 
      0, 
      id, 
      r.FormValue("saletype"), 
      0, 
      r.FormValue("description"), 
      0, 
      0) 

     PanicIf(err) 

Я получаю ошибку, когда я бегу он развернут на Heroku является:

pq: insert or update on table "bookitem" violates foreign key constraint"bookitem_book_fkey" 

На данный момент какие-либо предложения будет оценил, поскольку я дважды пытался исправить это безрезультатно.

P.S. Спасибо всем, кто помог мне понять, что это мой код, а не героку!

+0

Не знаете, на каком языке/библиотеке вы работаете, но уверены ли вы, что вы получаете идентификатор этого INSERT ... SELECT? Возможно, вы пытаетесь вставить повторяющуюся строку, чтобы «не существовал» что-то обнаружил, а INSERT никогда не выполнялся? –

+0

Вы должны пометить вопрос своим языком/каркасом/библиотекой, чтобы пользователи, которые его понимали, ответили. – eirikir

+0

Я работаю с go lang и sql базы данных. У меня есть id var, который определен выше (как int64). Я проверю, выдает ли он его, а затем запускает его вручную. – sasms

ответ

0

Таким образом, его изменение на QueryRow решило мои проблемы. Я считаю, что это должно было быть связано с проблемой параллелизма. Надеюсь, это полезно кому-то по дороге.

Смежные вопросы