У меня в Django есть следующая модель:
class Event(models.Model):
# some fields
start_date = models.DateField()
end_date = models.DateField()
Я использую базу данных Oracle 10g с Django 1.5 и cx_oracle 5.1.2. Проблема здесь в том, что когда я пытаюсь создать новый объект в интерфейсе администратора (выбирая даты из календаря), возникает следующая ошибка:
ORA-01843: not a valid month
syncdb
создал DATE
поле в oracle для start_date
и end_date
. Похоже ли это на внутреннюю ошибку или я что-то делаю не так?
У меня есть другие модели с DateTimeField()
, и они отлично работают, когда я сохраняю новые объекты, проблема, похоже, связана с самим DateField
.
ОБНОВЛЕНИЕ. Я проверил внутреннюю реализацию, и в backends/oracle/base.py
строках с 513 по 516:
cursor.execute(
"ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'"
" NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'"
+ (" TIME_ZONE = 'UTC'" if settings.USE_TZ else ''))
Выполнение этого оператора позволяет оператору вставки иметь буквальные значения для полей DATE
. Я проверил запрос, сгенерированный серверной частью, и он вставляет '2013-03-20'
в start_date
и end_date
. Дата совпадает с NLS_DATE_FORMAT
, так что теоретически это должно работать!
ОБНОВЛЕНИЕ: я считаю, что мой случай - относится к cx_oracle.
ОБНОВЛЕНИЕ: поскольку у меня до сих пор нет однозначного ответа (хотя я почти уверен, что эту проблему вызывает cx_oracle), я изменил свой DateField
на DateTimeField
, который переводится в TIMESTAMP
оракула и отлично работает .
TO_DATE('2013-03-20', 'YYYY-MM-DD')
? Судя по вашему вопросу, это похоже наNLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'
, что отличается от фактической вставки, хотя я не знаю, какой эффект это будет иметь в этом контексте. - person woemler   schedule 22.03.2013NLS_DATE_FORMAT
оператора alter session вы можете вставить дату как литерал без to_date, что имеет место, когда я проверяю выполняемый SQL. - person Aziz Alfoudari   schedule 22.03.2013ORA-01843
? - person woemler   schedule 22.03.2013cursor
? Это объект подключения или объект набора записей? - person Rachcha   schedule 22.03.2013self._param_generator(params)
; Я хотел увидеть, что передается в БД непосредственно перед ее выполнением, поскольку это ошибка ORA. - person Aziz Alfoudari   schedule 23.03.2013