基于django2.2连oracle11g解决版本冲突的问题

 更新时间:2020年07月02日 14:43:12   作者:观想  
这篇文章主要介绍了基于django2.2连oracle11g解决版本冲突的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

上次用django2.2和oracle11g,在migrate的时候发生了版本冲突,最终将Oracle升级到了12c才解决问题

那么到底能不能用别的方法来解决这个冲突呢?想了个解决思路,实践一下:

用django2.2连Oracle12c环境下做migrate,创建基础表

将基础表导出,再导入到Oracle11g数据库中

用django2.2连Oracle11g

实施步骤

1、用django2.2连Oracle12c环境下做migrate,创建基础表

在前文中已经完成,连接到数据库,可以看到有10张基础表

看一张表,比如AUTH_GROUP表,发现有个ID字段是用了12c特有的generated语法,除了DJANGO_SESSION外,其他每张表都有一个自增序列的id字段作为主键。

-- Create table
create table AUTH_GROUP
(
 id NUMBER(11) generated by default on null as identity,
 name NVARCHAR2(150)
)
tablespace DJANGO;
-- Create/Recreate primary, unique and foreign key constraints 
alter table AUTH_GROUP
 add primary key (ID)
 using index 
 tablespace DJANGO;
alter table AUTH_GROUP
 add unique (NAME)
 using index 
 tablespace DJANGO;

2. 将基础表导出,再导入到Oracle11g数据库中

导出django用户数据库,注意使用11g版本

接着导入到11g数据库中,非常顺利

再看AUTH_GROUP表,发现表结构是一样的,但是id上面自增序列的默认值没有了。

-- Create table
create table AUTH_GROUP
(
 id NUMBER(11) not null,
 name NVARCHAR2(150)
)
tablespace DJANGO;
-- Create/Recreate primary, unique and foreign key constraints 
alter table AUTH_GROUP
 add primary key (ID)
 using index 
 tablespace DJANGO;
alter table AUTH_GROUP
 add unique (NAME)
 using index 
 tablespace DJANGO;

3、用django2.2连Oracle11g

修改settings文件,连Oracle11g,然后启动django服务,果然成功启动

但是,但是,创建admin用户密码的时候就报错了,ORA-01400: cannot insert NULL into (“DJANGO”.“AUTH_USER”.“ID”)

PS D:\parttime\python\django\guanxiangzhiji> python manage.py createsuperuser
用户名 (leave blank to use 'administrator'):
电子邮件地址:
Password:
Password (again):
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Traceback (most recent call last):
 File "D:\app\anaconda\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
 return self.cursor.execute(sql, params)
 File "D:\app\anaconda\lib\site-packages\django\db\backends\oracle\base.py", line 510, in execute
 return self.cursor.execute(query, self._param_generator(params))
cx_Oracle.IntegrityError: ORA-01400: cannot insert NULL into ("DJANGO"."AUTH_USER"."ID")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "manage.py", line 21, in <module>
 main()
 File "manage.py", line 17, in main
 execute_from_command_line(sys.argv)
 File "D:\app\anaconda\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
 utility.execute()
 File "D:\app\anaconda\lib\site-packages\django\core\management\__init__.py", line 375, in execute
 self.fetch_command(subcommand).run_from_argv(self.argv)
 File "D:\app\anaconda\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
 self.execute(*args, **cmd_options)
 File "D:\app\anaconda\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 61, in execute
 return super().execute(*args, **options)
 File "D:\app\anaconda\lib\site-packages\django\core\management\base.py", line 364, in execute
 output = self.handle(*args, **options)
 File "D:\app\anaconda\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 156, in handle
 self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
 File "D:\app\anaconda\lib\site-packages\django\contrib\auth\models.py", line 162, in create_superuser
 return self._create_user(username, email, password, **extra_fields)
 File "D:\app\anaconda\lib\site-packages\django\contrib\auth\models.py", line 145, in _create_user
 user.save(using=self._db)
 File "D:\app\anaconda\lib\site-packages\django\contrib\auth\base_user.py", line 66, in save
 super().save(*args, **kwargs)
 File "D:\app\anaconda\lib\site-packages\django\db\models\base.py", line 741, in save
 force_update=force_update, update_fields=update_fields)
 File "D:\app\anaconda\lib\site-packages\django\db\models\base.py", line 779, in save_base
 force_update, using, update_fields,
 File "D:\app\anaconda\lib\site-packages\django\db\models\base.py", line 870, in _save_table
 result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
 File "D:\app\anaconda\lib\site-packages\django\db\models\base.py", line 908, in _do_insert
 using=using, raw=raw)
 File "D:\app\anaconda\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
 return getattr(self.get_queryset(), name)(*args, **kwargs)
 File "D:\app\anaconda\lib\site-packages\django\db\models\query.py", line 1186, in _insert
 return query.get_compiler(using=using).execute_sql(return_id)
 File "D:\app\anaconda\lib\site-packages\django\db\models\sql\compiler.py", line 1335, in execute_sql
 cursor.execute(sql, params)
 File "D:\app\anaconda\lib\site-packages\django\db\backends\utils.py", line 99, in execute
 return super().execute(sql, params)
 File "D:\app\anaconda\lib\site-packages\django\db\backends\utils.py", line 67, in execute
 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
 File "D:\app\anaconda\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
 return executor(sql, params, many, context)
 File "D:\app\anaconda\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
 return self.cursor.execute(sql, params)
 File "D:\app\anaconda\lib\site-packages\django\db\utils.py", line 89, in __exit__
 raise dj_exc_value.with_traceback(traceback) from exc_value
 File "D:\app\anaconda\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
 return self.cursor.execute(sql, params)
 File "D:\app\anaconda\lib\site-packages\django\db\backends\oracle\base.py", line 510, in execute
 return self.cursor.execute(query, self._param_generator(params))
django.db.utils.IntegrityError: ORA-01400: cannot insert NULL into ("DJANGO"."AUTH_USER"."ID")

原因分析

很明显,插入到AUTH_USER表时,没有指定ID的值,而ID是主键,非空。

因为在12c的环境下,这个ID是自增序列,insert语句中不需要指定这个值。

解决方案

解决方案也应运而出了,只要为每个ID列创建一个11g的序列,创建触发器,在插入数据时补上id值就行了。

(1)生成序列。

用sql语句

select 'create sequence seq_'||table_name||' minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;'
 from user_tab_columns
 where column_name='ID';

生成创建序列的批量执行语句,并执行。

create sequence seq_DJANGO_ADMIN_LOG minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_AUTH_USER minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_AUTH_USER_GROUPS minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_DJANGO_CONTENT_TYPE minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_AUTH_GROUP minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_AUTH_GROUP_PERMISSIONS minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_DJANGO_MIGRATIONS minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_AUTH_PERMISSION minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_AUTH_USER_USER_PERMISSIONS minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;

(2)创建触发器

用SQL语句

select 'create or replace trigger tri_'||table_name||'
 before insert
 on '||table_name||' 
 for each row
 declare
 begin
 :new.id:=seq_'||table_name||'.nextval;
 end tri_'||table_name||';
 /'
 from user_tab_columns
 where column_name='ID';

生成触发器脚本:

create or replace trigger tri_DJANGO_MIGRATIONS
	before insert
	on DJANGO_MIGRATIONS
	for each row
declare
begin
	:new.id:=seq_DJANGO_MIGRATIONS.nextval;
end tri_DJANGO_MIGRATIONS;
/
create or replace trigger tri_DJANGO_CONTENT_TYPE
	before insert
	on DJANGO_CONTENT_TYPE
	for each row
declare
begin
	:new.id:=seq_DJANGO_CONTENT_TYPE.nextval;
end tri_DJANGO_CONTENT_TYPE;
/
create or replace trigger tri_AUTH_PERMISSION
	before insert
	on AUTH_PERMISSION
	for each row
declare
begin
	:new.id:=seq_AUTH_PERMISSION.nextval;
end tri_AUTH_PERMISSION;
/
create or replace trigger tri_AUTH_GROUP
	before insert
	on AUTH_GROUP
	for each row
declare
begin
	:new.id:=seq_AUTH_GROUP.nextval;
end tri_AUTH_GROUP;
/
create or replace trigger tri_AUTH_GROUP_PERMISSIONS
	before insert
	on AUTH_GROUP_PERMISSIONS
	for each row
declare
begin
	:new.id:=seq_AUTH_GROUP_PERMISSIONS.nextval;
end tri_AUTH_GROUP_PERMISSIONS;
/
create or replace trigger tri_AUTH_USER
	before insert
	on AUTH_USER
	for each row
declare
begin
	:new.id:=seq_AUTH_USER.nextval;
end tri_AUTH_USER;
/
create or replace trigger tri_AUTH_USER_GROUPS
	before insert
	on AUTH_USER_GROUPS
	for each row
declare
begin
	:new.id:=seq_AUTH_USER_GROUPS.nextval;
end tri_AUTH_USER_GROUPS;
/
create or replace trigger tri_AUTH_USER_USER_PERMISSIONS
	before insert
	on AUTH_USER_USER_PERMISSIONS
	for each row
declare
begin
	:new.id:=seq_AUTH_USER_USER_PERMISSIONS.nextval;
end tri_AUTH_USER_USER_PERMISSIONS;
/
create or replace trigger tri_DJANGO_ADMIN_LOG
	before insert
	on DJANGO_ADMIN_LOG
	for each row
declare
begin
	:new.id:=seq_DJANGO_ADMIN_LOG.nextval;
end tri_DJANGO_ADMIN_LOG;
/

(3)此时再创建admin用户,就成功了

新增用户lurenjia成功!

以上这篇基于django2.2连oracle11g解决版本冲突的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在SAE上部署Python的Django框架的一些问题汇总

    在SAE上部署Python的Django框架的一些问题汇总

    这篇文章主要介绍了在SAE上部署Python的Django框架的一些问题汇总,SAE是新浪的一个在线APP部署平台,并且对Python应用提供相关支持,需要的朋友可以参考下
    2015-05-05
  • 详解python的函数递归与调用

    详解python的函数递归与调用

    Python中的函数递归是一种函数调用自身的编程技术,递归可以用来解决问题,特别是那些可以分解为更小、相似子问题的问题,本文将给大家详细的讲解一下python的函数递归与调用,需要的朋友可以参考下
    2023-10-10
  • Python中层次聚类的详细讲解

    Python中层次聚类的详细讲解

    层次聚类( Hierarchical Clustering )是聚类算法的一种,通过计算不同类别的相似度类创建一个有层次的嵌套的树,下面这篇文章主要给大家介绍了关于Python中层次聚类的详细讲解,需要的朋友可以参考下
    2022-12-12
  • 如何处理json中不带双引号的key的问题

    如何处理json中不带双引号的key的问题

    这篇文章主要介绍了如何处理json中不带双引号的key的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 五个Python命令使用的小妙招分享

    五个Python命令使用的小妙招分享

    平常在使用python命令过程中,基本上都是用来安装python库时才使用到在控制台的python命令。然而,python命令还有更多的妙用,本文就来为大家详细讲讲
    2022-07-07
  • Python实现的端口扫描功能示例

    Python实现的端口扫描功能示例

    这篇文章主要介绍了Python实现的端口扫描功能,涉及Python针对端口的连接、打开、关闭及线程相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • 利用Python+OpenCV三步去除水印

    利用Python+OpenCV三步去除水印

    去水印需要用到的库:cv2、numpy,cv2是基于OpenCV的图像处理库,可以对图像进行腐蚀,膨胀等操作.numpy这是一个强大的处理矩阵和维度运算的库,,需要的朋友可以参考下
    2021-05-05
  • 对Python中plt的画图函数详解

    对Python中plt的画图函数详解

    今天小编就为大家分享一篇对Python中plt的画图函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python lambda函数保姆级使用教程

    Python lambda函数保姆级使用教程

    本文和你一起探索Python中的lambda函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处理工作过程中更高效
    2022-06-06
  • Python基础进阶之海量表情包多线程爬虫功能的实现

    Python基础进阶之海量表情包多线程爬虫功能的实现

    这篇文章主要介绍了Python基础进阶之海量表情包多线程爬虫,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论