Модульное тестирование Django: перенесенная на юг БД работает в MySQL, выдает ошибку повторяющегося ПК в PostGreSQL Я что-то упустил или это ошибка? - PullRequest
0 голосов
/ 22 мая 2010

(Стоит начать с заявления об отказе: я очень новичок в PostGreSQL)

У меня есть сайт django, который включает стандартный файл тестирования app / tests.py.Если я перенесу БД в MySQL (через Юг), все тесты пройдут.

Однако в PostGresQL я получаю следующую ошибку:

IntegrityError: duplicate key value violates unique constraint "business_contact_pkey"

Обратите внимание, что это происходит, пока модультолько тестирование - фактическая страница отлично работает как в MySQL, так и в PostGresql.

На самом деле время, затрачиваемое на это, выясняется.У кого-нибудь есть идеи?Ниже приведен метод Postgresql "\ d business_contact" и тестирующий метод tests.py, если они помогают.Никаких изменений не было внесено ни в одну из БД, кроме (той же) миграции на юг

Спасибо

 first_name   | character varying(200)   | not null
 mobile_phone | character varying(100)   | 
 surname      | character varying(200)   | not null
 business_id  | integer                  | not null
 created      | timestamp with time zone | not null
 deleted      | boolean                  | not null default false
 updated      | timestamp with time zone | not null
 slug         | character varying(150)   | not null
 phone        | character varying(100)   | 
 email        | character varying(75)    | 
 id           | integer                  | not null default nextval('business_contact_id_seq'::regclass)
Indexes:
    "business_contact_pkey" PRIMARY KEY, btree (id)
    "business_contact_slug_key" UNIQUE, btree (slug)
    "business_contact_business_id" btree (business_id)
Foreign-key constraints:
    "business_id_refs_id_772cc1b7b40f4b36" FOREIGN KEY (business_id) REFERENCES business(id) DEFERRABLE INITIALLY DEFERRED
Referenced by:
    TABLE "business" CONSTRAINT "primary_contact_id_refs_id_dfaf59c4041c850" FOREIGN KEY (primary_contact_id) REFERENCES business_contact(id) DEFERRABLE INITIALLY DEFERRED

TEST DEF:

   def test_add_business_contact(self):
        """ Add a business contact """
        contact_slug = 'test-new-contact-added-new-adf'
        business_id = 1
        business = Business.objects.get(id=business_id)
        postdata = {
                'first_name': 'Test',
                'surname': 'User',
                'business': '1',
                'slug': contact_slug,
                'email': 'test@example.com',
                'phone': '12345678',
                'mobile_phone': '9823452',
                'business': 1,
                'business_id': 1,
                }

        #Test to ensure contacts that should not exist are not returned
        contact_not_exists = Contact.objects.filter(slug=contact_slug)
        self.assertFalse(contact_not_exists)

        #Add the contact and ensure it is present in the DB afterwards """
        contact_add_url = '%s%s/contact/add/' % (settings.BUSINESS_URL, business.slug)
        self.client.post(contact_add_url, postdata)
        added_contact = Contact.objects.filter(slug=contact_slug)
        print added_contact

        try:
            self.assertTrue(added_contact)
        except:
            formset = ContactForm(postdata)
            print formset.errors
            self.assertFalse(True, "Contact not found in the database - most likely, the post values in the test didn't validate against the form")

1 Ответ

2 голосов
/ 22 мая 2010

Нашел ответ - думал, что оставлю его здесь для потомков.

На юге я явно устанавливал идентификаторы первичного ключа для миграции данных. Секвенсор PGSQL не собирал их и пытался использовать значения PK, которые уже были установлены в данных.

Удаление явно заданных значений первичного ключа из миграций данных решило проблему.

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