【问题标题】:How to make Django 2.0 to use Oracle 11g syntax instead of 12c?如何让 Django 2.0 使用 Oracle 11g 语法而不是 12c?
【发布时间】:2017-12-28 06:54:21
【问题描述】:

这是我的开发环境:

  • Windows 7 (x64)
  • Python 3.6.3 64bit(虚拟环境)
  • Django 2.0
  • cx_Oracle 6.1
  • Oracle 11.2 Enterprise Edition 64 位(在远程计算机上)

我没有 migrate (django manage.py migrate) 因为 Django 正在创建适合 Oracle 12c 的 sql;但我使用的是 11g。

例如,django 尝试执行这个:

SELECT
CASE WHEN identity_column = 'YES' THEN 1 ELSE 0 END
FROM user_tab_cols
WHERE table_name = 'DJANGO_CONTENT_TYPE' AND
column_name = 'NAME';
('DJANGO_CONTENT_TYPE', 'NAME'); 
args=['DJANGO_CONTENT_TYPE', 'NAME']

identity_column 列在 oracle 11g 上不可用。

如何让 django 使用 11g 语法?

编辑:

追溯我在..\Lib\site-packages\django\db\backends\oracle\schema.py(方法_is_identity_column,第151行)中发现的异常:

cursor.execute("""
                SELECT
                    CASE WHEN identity_column = 'YES' THEN 1 ELSE 0 END
                FROM user_tab_cols
                WHERE table_name = %s AND
                      column_name = %s
            """, [self.normalize_name(table_name), self.normalize_name(column_name)])

所以语法是硬编码的。这是否意味着 Django 2.0 适用于 Oracle 12c 及更高版本?

【问题讨论】:

  • 我不知道。只是好奇:你得到什么错误?我希望绝大多数 SQL 语句都适用于这两个版本。
  • @Littlefoot 我发布了一个示例 sql。
  • 你能评论这段代码吗?正如您所说,11g 的 USER_TAB_COLS 中没有 IDENTITY_COLUMN。或者,也许,“硬编码”它以返回 0(因为 11g 中也没有标识列,它是在 12c 中引入的)。如“SELECT 0 FROM USER_TAB_COLS WHERE ...”

标签: django oracle11g


【解决方案1】:

来自release notes of django 2.0(我强调):

对 Oracle 11.2 的上游支持将于 2020 年 12 月结束。Django 1.11 将一直支持到 2020 年 4 月,几乎到了这个日期。 Django 2.0 正式支持 Oracle 12.1+

因此,为了支持任何其他版本的 Oracle,您应该降级到 1.11

【讨论】:

  • 糟糕!我错过了。谢谢!
猜你喜欢
  • 2014-10-03
  • 2015-06-08
  • 2016-05-20
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2019-10-02
相关资源
最近更新 更多