2017-02-22 15 views
0

Не удалось найти решение. Теперь я передаю список кортежей с информацией для вставки вместо того, чтобы извлекать из другой таблицы, и проблема исчезла.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 
+0

Сколько строк есть в 'other_table'? –

ответ

0

ли все это сразу:

with u as (
    update segment_speed_live_layer ssll 
    set speed = ssl.speed 
    from segment_speed_live ssl 
    where ssl.segment_id = ssll.segment_id 
) 
insert into segment_speed_live_layer (segment_id, geom, speed) 
select segment_id, geom_way, speed 
from 
    other_table ot 
    cross join 
    segment_speed_live ssl 
where not exists (
    select 1 
    from segment_speed_live_layer 
    where segment_id = ssl.segment_id 
) 
+0

Я не пробовал это решение, потому что видел его после того, как мне удалось заставить его работать другим способом. В любом случае, я благодарен за помощь. – gamda

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

  • Нет связанных вопросов^_^