Не удалось найти решение. Теперь я передаю список кортежей с информацией для вставки вместо того, чтобы извлекать из другой таблицы, и проблема исчезла.PostgreSQL false IntegrityError
В настоящее время я пишу код, который будет редактировать таблицу. У меня есть несколько строк информации для вставки, но я продолжаю получать IntegrityError
на четвертый элемент, независимо от порядка.
Вот как я создаю таблицу:
CREATE TABLE segment_speed_live_layer(segment_id INTEGER PRIMARY KEY,
geom GEOMETRY(LINESTRING, 4326),
speed INTEGER);
Теперь segment_id должен соответствовать другой таблице, так что нет и не может быть sequencial. Вот эта функция:
def update_layer():
segment_cursor = connection.cursor()
segment_query = 'SELECT segment_id, speed FROM segment_speed_live ORDER BY segment_id'
exists_cursor = connection.cursor()
exists_query = 'SELECT EXISTS(SELECT 1 FROM segment_speed_live_layer WHERE segment_id=%s)'
insert_cursor = connection.cursor()
insert_query = """INSERT INTO segment_speed_live_layer(segment_id, geom, speed)
SELECT %(segment_id)s, geom_way, %(speed)s
FROM other_table
WHERE segment_id=%(segment_id)s"""
update_query = 'UPDATE segment_speed_live_layer SET speed=%(speed)s WHERE segment_id=%(segment_id)s'
segment_cursor.execute(segment_query)
for row in segment_cursor:
segment_id, speed = row
exists_cursor.execute(exists_query, (segment_id,))
exists = exists_cursor.fetchone()[0]
query = update_query if exists else insert_query
print(segment_id, speed, exists)
print(insert_cursor.mogrify(query, {'segment_id': segment_id, 'speed': speed}))
insert_cursor.execute(query, {'segment_id': segment_id, 'speed': speed})
print(insert_cursor.statusmessage)
connection.commit()
Если я заказываю по скорости, он не работает на пятом, а не на четвертом элементе. Кажется, что он не работает на более низких идентификаторах. Это этап тестирования, поэтому я удалил и повторно создал таблицу несколько раз, I KNOW
в этой таблице нет строки с данным идентификатором.
Я прочитал this question и this blog post, но их решения не работают, потому что мои идентификаторы не назначаются последовательно или автоматически.
Моя единственная мысль на данный момент заключается в том, чтобы удалить ограничение PRIMARY KEY
, но это не идеально.
Выход для справки:
(243, 69, False)
INSERT INTO segment_speed_live_layer(segment_id, geom, speed)
SELECT 243, geom_way, 69
FROM other_table
WHERE other_table.segment_id=243
INSERT 0 1
(680, 9, False)
INSERT INTO segment_speed_live_layer(segment_id, geom, speed)
SELECT 680, geom_way, 9
FROM other_table
WHERE other_table.segment_id=680
INSERT 0 1
(11599, 42, False)
INSERT INTO segment_speed_live_layer(segment_id, geom, speed)
SELECT 11599, geom_way, 42
FROM other_table
WHERE other_table.segment_id=11599
INSERT 0 1
(16399, 40, False)
INSERT INTO segment_speed_live_layer(segment_id, geom, speed)
SELECT 16399, geom_way, 40
FROM other_table
WHERE other_table.segment_id=16399
Сколько строк есть в 'other_table'? –