2015-11-06 6 views
0

Приложение My Python использует Psycopg2 для вставки содержимого из веб-скребка в базу данных PostgreSQL. Psycopg2 жалуется, что определенный первичный ключ уже существует, хотя он явно этого не делает.Postgres говорит, что ключ уже существует, хотя он не

Ошибка:

psycopg2.IntegrityError: duplicate key value violates unique constraint "my_table_pkey" 
DETAIL: Key (id)=(12345) already exists. 

Запрос:

SELECT * FROM my_table where id=12345; 
-- 0 rows returned 

Что здесь происходит?

Edit для фона:

В основном, что код делает скрести дискуссионный форум, перебирает каждую страницу в каждой дискуссионной нити и вставляет некоторые данные из каждого потока в Postgres. Ниже приведена общая структура кода. Обратите внимание, что get возвращает хорошо отформатированную структуру данных для каждого потока.

import psycopg2 

base_url 'http://someforum.com' 
conn = psycopg2.connect('dbname=mydb user=me') 

for i in range(10000): 
    thread = get('{}/'{}.format(base_url, i) 
    for page in thread: 
     sql = 'INSERT INTO my_table (id, foo, bar) VALUES(%s, %s, %s);' 
     values = [page['id'], page['foo'], page['bar']] 
     cur.execute(sql, values) 
    conn.commit() 
cur.close() 
conn.close() 
+5

Либо 1) вы обнаружили абсолютно очевидную и относительно серьезную ошибку в широко используемом и сильно тестируемом программном продукте (хорошая работа!), Или 2) что-то в вашем коде вызывает PostgreSQL, чтобы выдать абсолютно разумную ошибку. Много раз за 40 лет разработки программного обеспечения я думал, что столкнулся (1). Все, за исключением случаев, когда это оказалось (2). Не видя больше своего кода, невозможно точно сказать, что происходит, но вы можете подумать, что случай (1) маловероятен. Возможно, если вы разместите больше своего кода, мы сможем больше помочь. Благодарю. –

+1

@BobJarvis: Это очень добрый и интересный способ заявить, что вопрос в основном бесполезен без большей части соответствующей информации. –

+0

Я никогда не утверждал, что это ошибка в PostgreSQL. –

ответ

2

После некоторого копания, я обнаружил, что на форуме я выскабливание иногда возвращает ошибочное количество страниц для данного потока. Поэтому, когда приложение пытается очистить страницу номер 5 (которая не существует), она вместо этого перенаправляется на страницу номер 4 и пытается вставить те же сообщения снова. Следовательно, ошибка целостности.

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