Я нахожусь в Python 2.7, используя psycopg2 для подключения к базе данных Amazon Redshift. У меня есть модульные тесты, а в методах setUp и tearDown для этого тестового класса я бросаю таблицы, созданные для этой проверки. Таким образом, схема:Проблема параллелизма с psycopg2, Redshift и unittest
def setUp(self):
drop_specific_tables()
create_specific_tables()
def tearDown(self):
drop_specific_tables()
Причиной падения в дистрибутиве, а также Teardown в случае тест выходит ненадежно и пропускает Teardown мы все еще можем знать, что всякий раз, когда он снова бежит он все равно будет начать с чистого листа ,
Это метод drop_specific_tables, а rcur - это курсор psycopg2, указывающий на нашу базу данных красного смещения.
def drop_specific_tables(rcur):
rcur.execute("BEGIN;")
rcur.execute("SELECT table_name "
" FROM information_schema.tables "
" WHERE table_schema='public' ")
tables = [row for row, in rcur]
rcur.execute("DROP TABLE IF EXISTS " + ", ".join(tables) + " CASCADE;")
rcur.execute("END;")
Когда выполняется индивидуальный тест, он проходит. Но когда весь класс запускаются, некоторые тесты ошибки в нАлАдкА или Teardown (это недетерминировано, который проверяет ошибки и которые drop_specific_tables), в drop_specific_tables(), на линии с
rcur.execute("SELECT table_name "
" FROM information_schema.tables "
" WHERE table_schema='public' ")
уступая ошибкой ProgrammingError: Relation with OID 1454844 does not exist.
I распечатал OID «information_schema.tables», и это не тот же OID, что и в сообщении об ошибке.
Почему это может произойти? Я понимаю, что это значит для отношения к не существует, но какое отношение этот запрос ищет, которого он не может найти? И почему это иногда не должно быть, вызывая запрос на ошибку?
UPDATE: Я также распечатывал OID каждой таблицы перед удалением, и ни один из них не является идентификатором OID в сообщении об ошибке!
пару ключей, так как читать ваш ответ: 1) Для каждой таблицы, я напечатал свой UID, прежде чем упасть, и ни один из них не являются один в сообщении об ошибке. 2) Я распечатал OID информационных_схем.tables, и это не тот, что в сообщении об ошибке. Почему ошибка возникает из этого простого запроса? Который даже использует таблицу information_schema, даже не созданную пользователем таблицу! – tscizzle
@tscizzle: Отредактирован ответ выше. Пожалуйста, поделитесь, если найдете исправление :-) – Paladin