Форум сайта python.su
Добрый день, уважаемые, не поделитесть ли секретом, кто как проверяет БД на наличие дубликатов, просто проблема в том, что есть таблица в базе, в таблице мне нужно, чтобы поиск шел по определнной колонке, и в БД записывалось значение только в том случае, если если оно там отсутствует,немного подробнее на http://sql.ru/forum/actualthread.aspx?tid=635371
В заумных решениях и извратах нету необходимости, пишется для собственных нужд :)
Отредактировано (Фев. 2, 2009 09:45:18)
Офлайн
Все, решил так :
link='''"google.com"'''
ck_val=(c.execute("select count() from URLS where URL="+link)).fetchone()[0]
if str(ck_val)=="(0,)":c.execute("insert into URLS (URL) values ("+link+")")
Офлайн
lorienСпасибо за помощь :)
Как вариант: ставите уникальный индекс на колонку, далее пытаетесь записать данные, если ловите exception, то значит уже такие данные есть.
Ваш код лучше записать так:link = 'google.com'
cursor.execute("SELECT COUNT() FROM URLS WHERE URL = %s", [link])
count = cursor.fetchone()[0]
if not count:
cursor.execute("INSERT INTO URLS (URL) VALUES (%s)", [link])
Офлайн
насчет уникального индекса
1. такой способ ИМХО более правильный, чем делать count() (а count без индекса - так вообще тормоз)
2. вот как это все примерно выглядит в коде:
#encoding: UTF-8
import sqlite3
con = sqlite3.connect('db.db')
cur = con.cursor()
cur.execute(""" CREATE TABLE tbl1 ( [word] VARCHAR(255) )""") #создаем таблицу с полем
cur.execute(""" CREATE UNIQUE INDEX [word] ON [tbl1] ([word])""") #делаем уникальный индекс
cur.execute(""" INSERT INTO tbl1 (word) values ("blah-blah")""") #делаем первую вставку
try:
cur.execute(""" INSERT INTO tbl1 (word) values ("blah-blah")""") #делаем вторую вставку
except sqlite3.IntegrityError, er: #словили исключение по причине неуникального индекса
print er
Отредактировано (Фев. 4, 2009 20:05:46)
Офлайн
diam123При проверке на уникальность - это плохой тон. Хороший - на уровне базы.
ck_val=(c.execute(“select count() from URLS where URL=”+link)).fetchone()
Офлайн
Всем спасибо за помощь, с индексами пока попозже буду разбираться, сейчас занят, пока оставлю как есть
Офлайн