Продолжить загрузку после IntegrityError - PullRequest
7 голосов
/ 09 июля 2010

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

Проблема, с которой я столкнулся, заключалась в том, что ошибки первичного ключа приводили к ошибке 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 Я не могу скопировать и вставить весь код в этой сети, любая помощь будет принята с благодарностью. Прямо сейчас у меня нет ПК, настроенных для работы ...

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

Используйте цикл for для итерации по списку и используйте execute вместо executemany. Окружите цикл for попыткой и продолжением выполнения после исключения. Примерно так:

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 голосов
/ 09 июля 2010

Вы можете использовать lastrowid, чтобы получить точку, где вы остановились:

http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.lastrowid

Однако, если вы используете ее, вы не можете использовать executemany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...