使用Django连接Oracle 11g数据库

公司用Java开发了一套程序,我想用Django连进数据库看看。---这是一篇入门文章。

我的环境
  • Django 1.11.11
  • cx-Oracle 6.1
  • virtualenv
安装cx-Oracle
pip install cx-Oracle
创建Django的Project
django-admin.py startproject mysite**
在settings.py中修改DATABASES为Oracle的连接
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.oracle',
 'NAME': 'DEMO',
 'USER': 'demo1',
 'PASSWORD': 'demo1',
 'HOST': "10.XXX.XXX.XXX",  # Set to empty string for localhost
 'PORT': '1521',             #端口
 }
}

这时候python manage.py runserver,网站应该可以跑起来。

使用inspectdb功能连接到Oracle已存在的表

接下来和正常的Django开发没啥区别,不想多说,这里接下来只描述这种情况,在Oralce的DEMO数据库中有很多已有的表,我们如何使用这些已经存在的表,并与它们直接连接。Django很方便的可以和这些表对接上。

正常django开发是在APP中,创建Model,然后migrate到数据库。这里我们用到inspectdb功能,用来检测数据库表,并根据表结构生成Model。

继续我们的试验

python manage.py inspectdb AAA > aaa.py

看一下导出的AAA,注意关键点是生成的Model,都标识为managed = False,意思是Django不管这个表本身的创建,修改,删除等事情。

from __future__ import unicode_literals
from django.db import models
class Aaa(models.Model):
 data_XXX_id = models.FloatField()
 data_XXXX_code = models.CharField(max_length=100)
 data_XXXX_name = models.CharField(max_length=2000, blank=True, null=True)
 sXXXX_name = models.CharField(max_length=100)
 stXXXX = models.CharField(max_length=100)
 joXXXXX = models.FloatField(blank=True, null=True)
 creation_date = models.DateField()
 created_by = models.FloatField()
 last_update_date = models.DateField()
 last_updated_by = models.FloatField()
 class Meta:
 managed = False
 db_table = 'AAA'

创建一个APP

python manage.py startapp abcdt

将abcdt加入settings.py

INSTALLED_APPS = [
...
 'django.contrib.staticfiles',
 'abcdt',
]

在Admin.py中注册

admin.site.register(ConContract)

进入后台,可以看到AaaS:

使用Django连接Oracle 11g数据库_第1张图片
image.png

点击进入后,会出现讨厌的ORA-00904错误,告诉我们Django实际很挑剔,想用他的ORM,数据库表必须带Primary Key:

使用Django连接Oracle 11g数据库_第2张图片
image.png

在数据库中加入ID主键,然后再次inspectdb,发现Model中多出一行

id = models.FloatField(primary_key=True)

然后就可以愉快的使用Django后台管理这个表了。

使用Django连接Oracle 11g数据库_第3张图片
image.png
另外两个让人不愉快的错误ORA-02000
  • ORA-02000: missing ALWAYS keyword when create identity column based table

这个错误根本原因在Django 2.0 的release note说明了,Django2.0只支持Oracle 12.1,要连接11g,只能降级到Django 1.11

The end of upstream support for Oracle 11.2 is Dec. 2020. Django 1.11 will be supported until April 2020 which almost reaches this date. Django 2.0 officially supports Oracle 12.1+.

  • ORA-00942: table or view does not exist

自己创建Model的时候,指定table名称没写对时,会出现这个错误

 class Meta:
     db_table = 'AAA'

正文完

文章同步发布于公众号“Django编程”,欢迎关注!

使用Django连接Oracle 11g数据库_第4张图片
文末二维码-扫一扫关注更多资讯.png

你可能感兴趣的:(使用Django连接Oracle 11g数据库)