Избегайте дублирования данных PostgreSQL - PullRequest
0 голосов
/ 22 ноября 2011

Как мне вставить эти artist в базу данных, только если does not существует в базе данных.Я написал следующий код.Но это неправильно.Не могли бы вы помочь мне?спасибо

Список исполнителей

Lata Mangeshkar  
Lata Mangeshkar
Lata Mangeshkar
Asha Bhosle
Lata Mangeshkar
Mahendra Kapoor  
Lata Mangeshkar
Kishore Kumar
Lata Mangeshkar

Мой код

for l in artist:
        l = l.strip()
        cursor.execute("SELECT id FROM song_artist WHERE name = %s ;" ,(l,) ) # Id exist?
        artist_rows = cursor.fetchone()
        if not artist_rows:
            artist_slug = self.makeSlug(artist[0])
            cursor.execute( 'INSERT INTO song_artist (name,slug) VALUES (%s,%s) RETURNING id;',(artist[0],artist_slug))
            print k

Вывод:

INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Asha Bhosle,asha-bhosle) RETURNING i
d;
INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Mahendra Kapoor,mahendra-kapoor) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Mahendra Kapoor,mahendra-kapoor) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;

ВЫХОД ДОЛЖЕН БЫТЬ:

INSERT INTO song_artist (name,slug) VALUES (Asha Bhosle,asha-bhosle) RETURNING i
d;
INSERT INTO song_artist (name,slug) VALUES (Lata Mangeshkar,lata-mangeshkar) RET
URNING id;
INSERT INTO song_artist (name,slug) VALUES (Mahendra Kapoor,mahendra-kapoor) RET
URNING id;

ОБНОВЛЕНИЕ:

Я уже добавил ограничение на имя столбца для обеспечения уникальности столбца.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011
  1. Обеспечить это на стороне базы данных. Добавьте ограничение на имя столбца, чтобы обеспечить его уникальность. Этого должно быть достаточно:

    ALTER TABLE song_artist ДОБАВИТЬ УНИКАЛЬНЫЙ (имя);

    Таким образом, вы можете быть уверены, что что бы вы ни делали, у вас не будет дублирующихся значений.

  2. Вы можете вставить данные, используя такие запросы:

    INSERT INTO song_artist (name, slug)
    ВЫБЕРИТЕ «Махендра Капур», «Махендра Капур»
    ГДЕ НЕ СУЩЕСТВУЕТ
    (
    ВЫБРАТЬ 42
    FROM song_artist
    ГДЕ имя = 'Махендра Капур'
    )

0 голосов
/ 23 ноября 2011

Вы должны использовать if not artist_rows: Это все

    artist_slug = self.makeSlug(l)

cursor.execute("SELECT count(id) FROM song_artist WHERE name = %s and slug = %s ;" ,(l,artist_slug) ) # Id exist?
artist_rows = cursor.fetchone()
#artist_rows = artist_rows[0]
db.commit()
if not artist_rows:
cursor.execute( 'INSERT INTO song_artist (name,slug) VALUES (%s,%s) RETURNING id;',(l,artist_slug))
#k=( 'INSERT INTO song_artist (name,slug) SELECT %s,%s WHERE NOT EXISTS ( SELECT 42 FROM song_artist WHERE name = %s) RETURNING id;'%(l,artist_slug,l))
artist_id = cursor.fetchone()[0] # get mysql_insert_id using RETURNING
db.commit()
0 голосов
/ 22 ноября 2011

Вы можете добавить уникальное ограничение, как предложил Szymon Guz,

ALTER TABLE song_artist ADD UNIQUE (name);

Затем используйте попытку / исключение для обработки дублирующейся ошибки:

try:
  cursor.execute( 'INSERT INTO song_artist (name,slug) VALUES (%s,%s) RETURNING id;',(artist[0],artist_slug))

except psycopg2.IntegrityError:
  debug.print 'Duplicate values found.  Insert was not successful'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...