Django - Oracle 后端错误

标签 django oracle oracle10g django-orm cx-oracle

我在 Django 中有以下模型:

class Event(models.Model):
    # some fields
    start_date = models.DateField()
    end_date = models.DateField()

我在 Django 1.5 和 cx_oracle 5.1.2 中使用 Oracle 10g 数据库。这里的问题是当我尝试在管理界面中创建一个新对象(从日历中选择日期)时,会引发以下错误:
ORA-01843: not a valid month
syncdb已创建 DATE oracle 中的字段 start_dateend_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_dateend_date .日期匹配 NLS_DATE_FORMAT ,所以这在理论上应该有效!

更新 : 我相信我的情况是 related to cx_oracle .

更新 :由于我仍然没有明确的答案(尽管我几乎可以肯定是 cx_oracle 导致了这个问题),我更改了我的 DateFieldDateTimeField翻译成 oracle 的 TIMESTAMP并且工作得很好。

最佳答案

基于 jtiai问题description ,我做了以下解决方法 - 在调用任何有问题的 sql-s(例如 oracle 10.5.0.2 和 11.2.0.1,cx_oracle 5.1.2)之前,再次重置 NLS_DATE_FORMAT/NLS_TIMESTAMP_FORMAT - 在 django/db/backends/oracle/base.py 中完成方法 def execute(...) :

--- base.py 2013-10-31 12:19:24.000000000 +0100
+++ base_new.py 2013-10-31 12:20:32.000000000 +0100
@@ -707,6 +707,18 @@
         query = convert_unicode(query % tuple(args), self.charset)
         self._guess_input_sizes([params])
         try:
+            # BUG-WORKAROUND: ulr1-131031 
+            # https://stackoverflow.com/a/17269719/565525
+            # It's actually a bug in the Oracle 10.5.0.2 and 11.2.0.1. Bug can be reproduced as following:
+            #     - set NLS_TIMESTAMP_FORMAT in session.
+            #     - Run any implicit or explicit TO_DATE conversion with unicode data.
+            #     - **Next implicit or explicit TO_TIMESTAMP with unicode data will trigger internal reset of timestamp format.**
+            #     - All consecutive TO_TIMESTAMP will fail and TO_CHAR of timestamp will produce invalid output.
+            self.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 ''))
+
             return self.cursor.execute(query, self._param_generator(params))
         except Database.IntegrityError as e:
             six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])

关于Django - Oracle 后端错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15525312/

相关文章:

python - 我如何为 Django 注册创建自定义 Django 后端?

python - Django 和 FeinCMS : A way to use the Media Library in other normal models?

sql - 将记录复制到另一个表添加字段

oracle - 注释 Oracle 存储过程

stored-procedures - Oracle-返回新插入的键值

sql - 没有主键的外键引用

django - 获取模型的所有对象,除了

python - 按数据库列进行 DRF 序列化器验证

sql - Oracle sql 或 pl/sql : Compute based on previous row values and on date column

MySQL 并实现一些接近序列的东西?