Django资料之Oracle数据库连接和操作

本文介绍了如何在Django项目中使用Oracle数据库,包括下载cx-Oracle模块、解决环境配置问题、设置DATABASES和INSTALLED_APPS,以及数据库表的正向和反向生成。在配置过程中,可能会遇到版本不匹配、缺少必要组件等问题,文中提供了相应的解决方案。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

◆ 下载cx-Oracle模块:

pip install cx-Oracle

下载地址:https://pypi.org/project/cx-Oracle/

◆ 测试脚本:

# -*- coding: utf-8 -*-
import cx_Oracle as cx      #导入模块
con = cx.connect('root', 'root123', '127.0.0.1:1521/ORCL')  #创建连接
cursor = con.cursor()       #创建游标
cursor.execute("select * from dual")  #执行sql语句
data = cursor.fetchone()        #获取一条数据
print(data)     #打印数据
cursor.close()  #关闭游标
con.close()     #关闭数据库连接

◆ 报错处理:

1、Unable to acquire Oracle environment handle

解决方案:

python访问oracle数据需要以下必要条件

  1. cx_oracle包
  2. oracle客户端(或简端)例如:instantclient_12_1

此处为instantclient版本和cx_oracle包不匹配导致的,cx_oracle5.2可以用instantclient_12_2版本

1、下载对应的instant_client包
2、将里面所有的dll文件拷贝到python的site-packages目录(或者在path中添加instant_client包的路径)

instant_client下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html

◆ 修改项目中的settings.py文件:

1、配置DATABASES

方式一:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.oracle',
    'NAME': 'IP:端口号/service_name',
    'USER': '用户名',
    'PASSWORD': '密码',
  }
}

方式二:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.oracle',
    'NAME': '数据库SID',
    'USER': '用户名',
    'PASSWORD': '密码',
    'HOST':'IP',
    'PORT':'端口号'
  }
}

2、配置INSTALLED_APPS

# Application definition  
  
INSTALLED_APPS = [  
    'django.contrib.admin',  
    'django.contrib.auth',  
    'django.contrib.contenttypes',  
    'django.contrib.sessions',  
    'django.contrib.messages',  
    'django.contrib.staticfiles',  
    'hello',  
]

◆ 数据库表生成:

1、正向生成:

创建models

from django.db import models

class AlarmGroup(models.Model):
    group_name = models.CharField(primary_key=True, max_length=250)
    group_des = models.TextField(blank=True, null=True)
    members = models.TextField(blank=True, null=True)
    timestamp = models.DateTimeField()

执行命令正向生成

python manage.py makemigrations
python manage.py migrate

2、反向生成:

数据库中创建表

CREATE TABLE `alarm_group` (
  `group_name` varchar(250) NOT NULL,
  `group_des` blob,
  `members` blob,
  `timestamp` datetime NOT NULL,
  `on_duty` blob,
  `leader` blob,
  PRIMARY KEY (`group_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

执行命令,生成model.py代码

python manage.py inspectdb

生成的代码model.py如下

class AlarmGroup(models.Model):
    group_name = models.CharField(primary_key=True, max_length=250)
    group_des = models.TextField(blank=True, null=True)
    members = models.TextField(blank=True, null=True)
    timestamp = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'alarm_group'

!反向生成报错:

1、ORA-00904 IDENTITY_COLUMN

解决方案:

把django版本降低到1.11.22后运行inspectdb,,然后再升级回来

(1)卸载django

PS D:\> pip uninstall django
Uninstalling Django-2.2.4:
  Would remove:
    d:\app\anaconda\lib\site-packages\django-2.2.4.dist-info\*
    d:\app\anaconda\lib\site-packages\django\*
    d:\app\anaconda\scripts\django-admin.exe
    d:\app\anaconda\scripts\django-admin.py
Proceed (y/n)? y
  Successfully uninstalled Django-2.2.4

(2)安装django1.11

PS D:\parttime\python\django\guanxiangzhiji> pip install django==1.11
Collecting django==1.11
  Using cached https://files.pythonhosted.org/packages/47/a6/078ebcbd49b19e22fd560a2348cfc5cec9e5dcfe3c4fad8e64c9865135bb/Django-1.11-py2.py3-none-any.whl
Requirement already satisfied: pytz in d:\app\anaconda\lib\site-packages (from django==1.11) (2018.9)
Installing collected packages: django
Successfully installed django-1.11

(3)运行inspectdb命令

PS D:\django\guanxiangzhiji> python manage.py inspectdb >models.py

2、‘cx_Oracle.Cursor’ object has no attribute ‘numbersAsStrings’

cx_oracle6.1版本之后没有numbersAsStrings属性了,需要将cx_oracle版本降至5.2

注:改变cx_oracle版本的时候需注意instant_client的版本

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值