【发布时间】: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 ...”