上次用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"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解决版本冲突的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】