Приложение 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()
Либо 1) вы обнаружили абсолютно очевидную и относительно серьезную ошибку в широко используемом и сильно тестируемом программном продукте (хорошая работа!), Или 2) что-то в вашем коде вызывает PostgreSQL, чтобы выдать абсолютно разумную ошибку. Много раз за 40 лет разработки программного обеспечения я думал, что столкнулся (1). Все, за исключением случаев, когда это оказалось (2). Не видя больше своего кода, невозможно точно сказать, что происходит, но вы можете подумать, что случай (1) маловероятен. Возможно, если вы разместите больше своего кода, мы сможем больше помочь. Благодарю. –
@BobJarvis: Это очень добрый и интересный способ заявить, что вопрос в основном бесполезен без большей части соответствующей информации. –
Я никогда не утверждал, что это ошибка в PostgreSQL. –