столбец is_superuser имеет целочисленный тип, но выражение имеет логический тип Ошибка DJANGO

Мне не помешала бы помощь. Мой сайт python 3.4 Django 1.7.4 отлично работал с использованием sqlite. Теперь я перенес его на Heroku, который использует Postgres. И когда я пытаюсь создать пользователя/пароль, я получаю эту ошибку:

column "is_superuser" is of type integer but expression is of type boolean
LINE 1: ...15-02-08 19:23:26.965870+00:00', "is_superuser" = false, "us...
                                                             ^
HINT:  You will need to rewrite or cast the expression.

The last function call in the stack trace is:
/app/.heroku/python/lib/python3.4/site-packages/django/db/backends/utils.py in execute
                return self.cursor.execute(sql, params) ...
▶ Local vars

У меня нет доступа к базовому коду django, только к коду моего приложения. Так что любая помощь, чтобы заставить это работать, была бы действительно полезной.


person user3470096    schedule 20.02.2015    source источник
comment
Можете ли вы опубликовать полную трассировку, пожалуйста.   -  person Burhan Khalid    schedule 22.02.2015


Ответы (3)


Мне кажется, что вы используете необработанные SQL-запросы вместо вызовов Django ORM, и это вызывает проблемы с переносимостью при переключении механизмов базы данных. Я настоятельно рекомендую использовать ORM, если это возможно в вашем случае. Если нет, то я бы сказал, что вам нужно самостоятельно определять движок базы данных и строить запросы в зависимости от текущего движка.

В этом случае вы можете попробовать использовать 0 вместо false, я думаю, это должно работать как на SQLite, так и на Postgres.

person Dariusz Aniszewski    schedule 20.02.2015
comment
Извините, Django выполняет все SQL-запросы, здесь нет необработанных запросов. Все уже основано на ORM из моделей. Ошибка в базовом коде django. - person user3470096; 20.02.2015
comment
Я на самом деле рад это слышать ;) Итак, давайте копнем глубже - как вы тогда создавали таблицы? Может быть, вы взяли SQL, который создал базу данных в SQLlite, и выполнили это на Postgres? Я догадываюсь, но этот столбец должен быть логическим, а не int, если он был создан с помощью команд управления django... - person Dariusz Aniszewski; 20.02.2015
comment
Что ж, поскольку все основано на модели, я просто говорю Django, какой тип базы данных использовать в приложении settings.py. Единственное изменение, которое я сделал, это использовать рекомендуемые настройки базы данных Heroku вместо настроек Django sqlite. - person user3470096; 20.02.2015
comment
Извините, но это не ответ на мой вопрос. Не могли бы вы рассказать мне/нам, как именно вы создали таблицы? Использовали ли вы команды управления Django на Heroku или напрямую подключались к базе данных и выполняли произвольный SQL, взятый из схемы SQLite? Также было бы полезно, если бы вы могли предоставить настройку DATABASES из settings.py и содержимое requirements.txt - возможно, вы используете какой-то странный коннектор postgress, который не выполняет правильное преобразование значений (что происходит здесь). - person Dariusz Aniszewski; 21.02.2015

Я столкнулся с той же проблемой при выполнении необработанных запросов sql в django, но решил ее, просто используя True | False для приведения логических выражений вместо 0 | 1.

Ниже написан блок кода запроса, который отлично выполняется в django.

cursor.execute(
   "insert into userapi_user(email,username,first_name,last_name,mobile_number,password,is_superuser,is_staff,is_active,date_joined)"
    "values(%s,%s,%s,%s,%s,%s,False,False,True,%s)",
    (email, username, first_name, last_name, mobile_number, password, date)
)
person hamzaimran    schedule 16.02.2021

Проблема вызвана тем, что переменная пытается изменить типы данных (например, с поля char на дату и время) в файлах миграции. База данных, такая как PostgreSQL, может не знать, как изменить тип переменной.

Итак, убедитесь, что переменная имеет один и тот же тип во всех миграциях.

person user3470096    schedule 20.02.2015
comment
я забыл упомянуть. особая благодарность apollo13 на #django за то, что он это понял. - person user3470096; 21.02.2015