Django syncdb на исходных данных SQL с использованием PostgreSQL выдает «столбец ... не существует» - PullRequest
1 голос
/ 20 сентября 2009

Платформа: Python 2.5, рут разработки Django, PostgreSQL 8.4, Windows Vista Ultimate SP2. Процедура: Документация Django, выпуск 1.0, текст ссылки , раздел 34.2, Предоставление исходных данных SQL.

КОД:

models.py:  

class aisc_customary(models.Model):
    MTYPE                 = models.CharField(max_length=4, editable=False, 
                                help_text="Shape type, e.g. W, C, L, etc.")
    EDI_STD_NOMENCLATURE  = models.CharField(max_length=26, editable=False, 
                                help_text="EDI shape designation")
    AISC_MANUAL_LABEL     = models.CharField(max_length=26, editable=False, primary_key=True, 
                                help_text="AISC Manual label")
    T_F                   = models.CharField(max_length=1, editable=False, 
                                help_text="Special note flag, T or F")
    W                     = models.FloatField(editable=False, 
                                help_text="Nominal weight, lbs/ft")
... (45 more FloatFields)


application1/sql/aisc_customary.sql:  

    INSERT INTO application1_aisc_customary (MTYPE, EDI_STD_NOMENCLATURE, AISC_MANUAL_LABEL, T_F, W, A, D, HT, OD, BF, B, ID, TW, TF, T, TNOM, TDES, KDES, KDET, K1, X, Y , E0, XP, YP, BF_2TF, B_T, H_TW, H_T, D_T, IX, ZX, SX, RX, IY, ZY, SY, RY, RZ, J, CW, C, WNO, SW, QF, QW, RO, H, TAN_ALPHA, QS) VALUES ('W', 'W44X335', 'W44X335', 'F', 335, 98.5, 44.0, 0, 0, 15.9, 0, 0, 1.03, 1.77, 0, 0, 0.00, 2.56, 2.63, 1.31, 0.00, 0.00, 0.00, 0.00, 0.00, 4.50, 0.00, 38.0, 0.00, 0.00, 31100, 1620, 1410, 17.8, 1200, 236, 150, 3.49, 0.00, 74.7, 535000, 0.00, 168, 1180, 278, 805, 0.00, 0.00, 0.00, 0.00);
    INSERT INTO application1_aisc_customary (MTYPE, EDI_STD_NOMENCLATURE, AISC_MANUAL_LABEL, T_F, W, A, D, HT, OD, BF, B, ID, TW, TF, T, TNOM, TDES, KDES, KDET, K1, X, Y , E0, XP, YP, BF_2TF, B_T, H_TW, H_T, D_T, IX, ZX, SX, RX, IY, ZY, SY, RY, RZ, J, CW, C, WNO, SW, QF, QW, RO, H, TAN_ALPHA, QS) VALUES ('W', 'W44X290', 'W44X290', 'F', 290, 85.4, 43.6, 0, 0, 15.8, 0, 0, 0.865, 1.58, 0, 0, 0.00, 2.36, 2.44, 1.25, 0.00, 0.00, 0.00, 0.00, 0.00, 5.02, 0.00, 45.0, 0.00, 0.00, 27000, 1410, 1240, 17.8, 1040, 205, 132, 3.49, 0.00, 50.9, 461000, 0.00, 166, 1040, 248, 701, 0.00, 0.00, 0.00, 0.00);
    INSERT INTO application1_aisc_customary (MTYPE, EDI_STD_NOMENCLATURE, AISC_MANUAL_LABEL, T_F, W, A, D, HT, OD, BF, B, ID, TW, TF, T, TNOM, TDES, KDES, KDET, K1, X, Y , E0, XP, YP, BF_2TF, B_T, H_TW, H_T, D_T, IX, ZX, SX, RX, IY, ZY, SY, RY, RZ, J, CW, C, WNO, SW, QF, QW, RO, H, TAN_ALPHA, QS) VALUES ('W', 'W44X262', 'W44X262', 'F', 262, 76.9, 43.3, 0, 0, 15.8, 0, 0, 0.785, 1.42, 0, 0, 0.00, 2.20, 2.25, 1.19, 0.00, 0.00, 0.00, 0.00, 0.00, 5.57, 0.00, 49.6, 0.00, 0.00, 24100, 1270, 1110, 17.7, 923, 182, 117, 3.47, 0.00, 37.3, 405000, 0.00, 165, 928, 223, 630, 0.00, 0.00, 0.00, 0.00);

... (1965 more lines like this)

Сервер разработки Django работает нормально, а сервер PostgreSQL работает и отвечает на запросы о данных других моделей, когда проблемный файл исходных данных удаляется из стандартного пути.

При удалении предыдущих версий неверных таблиц с помощью pgAdmin III консольная команда «python manage.py syncdb» выдает эту ошибку:

Создание таблицы application1_aisc_customary Установка пользовательского SQL для модели application1.aisc_customary Не удалось установить пользовательский SQL для модели application1.aisc_customary: столбец "mtype" отношения "application1_aisc_customary" не существует ЛИНИЯ 1: INSERT INTO application1_aisc_customary (MTYPE, EDI_STD_NOME ...

Карат указывает на М MTYPE. Несмотря на ошибку, столбец (верхний регистр) MTYPE действительно существует, что можно увидеть с помощью pgAdmin III. Обратите внимание, что администратор Django сообщает о таблице, но у нее нет записей.

Я пробовал Unicode и ANSI-кодировку для SQL, используя editable = False для атрибутов модели и имена в нижнем регистре для всего, кроме атрибутов модели. Может быть, мне не хватает какой-то подготовительной инструкции SQL. Я вычеркиваю. Я был бы чрезвычайно благодарен за поучительный ответ. Заранее благодарим за помощь.

09/21/09: для протокола, ответ Залева является правильным. Нужны имена полей в нижнем регистре. Мне также пришлось изменить одно имя поля, id (внутренний диаметр) на i_d, чтобы исправить очевидный конфликт с первичным ключом. Я изменил od на o_d, чтобы соответствовать. Проблема решена.

Ответы [ 2 ]

1 голос
/ 21 сентября 2009

Я провел тест с тем же результатом, что и вы. U должен использовать строчные имена полей, чтобы он работал. Тем не менее, вам не нужно переписывать sql, вы можете оставить прописные буквы в sql, имея строчные буквы в определении модели, и все будет работать отлично! что странно, потому что имена столбцов PgSql чувствительны к регистру. С другой стороны, Django не позволит вам иметь два поля - одно строчное и одно прописное с тем же именем (вероятно, заблокировано из-за различных систем БД, с которыми работает django), так что ... все еще странно :)

Не могу найти какие-либо подробности об этой проблеме, хотя. Просто следуйте строчным соглашениям. Отредактируйте поля модели, чтобы опустить и запустить ваш sql.

0 голосов
/ 20 сентября 2009

Хм. Возможно, ваш пользовательский SQL выполняется до создания таблицы с помощью команды syncdb?

...