2010-07-09 2 views
6

В python я заполняю базу данных SQLITE с помощью importmany, поэтому я могу импортировать сразу десятки тысяч строк данных. Мои данные содержатся в виде списка кортежей. У меня была база данных с основными ключами, где я их хотел.Продолжить загрузку после IntegrityError

Проблема Я столкнулся с ошибками первичного ключа, которые вызовут IntegrityError. Если я обрабатываю исключение, мой скрипт перестает импортировать в конфликте первичного ключа.
попробовать:

try: 
    self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList) 
except IntegrityError: 
    print "Primary key error" 
conn.commit() 


Так что мои вопросы, в Python с использованием ImportMany можно:

1. Захват значения, которые нарушают первичный ключ?
2. Продолжайте загружать данные после получения моих первичных ошибок.

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

Unforutnley Я не могу скопировать и вставить весь код в этой сети, любая помощь будет принята с благодарностью. Сейчас у меня нет никаких установленных первичных ключей как работа вокруг ...

ответ

0

Используйте цикл for для перебора по списку и используйте execute вместо executeemany. Окружайте цикл for с помощью try и продолжайте выполнение после исключения. Что-то вроде этого:

for it in self.insertList: 
    try: 
     self.curs.execute("INSERT into towers values (NULL,?,?,?,?)",it) 
    except IntegrityError: 
     #here you could insert the itens that were rejected in a temporary table 
     #without constraints for later use (question 1) 
     pass 
conn.commit() 

Вы даже можете подсчитать, сколько элементов в списке было вставлено.

+0

Как я понимаю, 'executemany' существует, потому что он предлагает значительное увеличение скорости по сравнению с python-итерированными командами' execute'. Таким образом, ваше решение, хотя оно будет работать, значительно замедлит огромный импорт данных. Одним из решений было бы отслеживать первичные ключи, которые были добавлены в набор python, и предварительно фильтровать insertList перед подачей на курсор. –

+0

@PeterMcMahan OK Я согласен. Это не эффективный код. Он только «работает», как вы сказали. – jheyse

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