Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 2, 2009 09:40:10

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite [проверка на наличие]

Добрый день, уважаемые, не поделитесть ли секретом, кто как проверяет БД на наличие дубликатов, просто проблема в том, что есть таблица в базе, в таблице мне нужно, чтобы поиск шел по определнной колонке, и в БД записывалось значение только в том случае, если если оно там отсутствует,немного подробнее на http://sql.ru/forum/actualthread.aspx?tid=635371

В заумных решениях и извратах нету необходимости, пишется для собственных нужд :)



Отредактировано (Фев. 2, 2009 09:45:18)

Офлайн

#2 Фев. 2, 2009 12:12:30

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite [проверка на наличие]

Все, решил так :

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+")")



Офлайн

#3 Фев. 4, 2009 13:12:07

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite [проверка на наличие]

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])
Спасибо за помощь :)
А можно поподробнее, как поставить уникальный индекс ?



Офлайн

#4 Фев. 4, 2009 20:01:25

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite [проверка на наличие]

насчет уникального индекса
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
реакция на неудавшуюся вставку у SQLITE может быть разной ( не обязательно exception). Подробнее см. здесь:
http://www.sqlite.org/lang_insert.html



Отредактировано (Фев. 4, 2009 20:05:46)

Офлайн

#5 Фев. 5, 2009 11:21:02

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite [проверка на наличие]

diam123
ck_val=(c.execute(“select count() from URLS where URL=”+link)).fetchone()
При проверке на уникальность - это плохой тон. Хороший - на уровне базы.



Офлайн

#6 Фев. 9, 2009 21:06:30

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite [проверка на наличие]

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version