django 2.2に基づいてoracle 11 gバージョンの衝突を解決します。
11690 ワード
前回はdjango 2.2とoracle 11 gで、migrateの時バージョンの衝突が発生しました。最終的にOracleを12 cにアップグレードして問題を解決します。です。
この衝突は他の方法で解決できますか?解決策を考えて、実践してみました。
django 2.2でOracle 12 cの環境の下でmigrateをして、基礎表を作ります。
ベーステーブルをエクスポートしてOracle 11 gデータベースに導入します。
django 2.2でOracle 11 gまでです。
実施の手順
1、django 2.2でOracle 12 cの環境下でmigrateを作り、基礎表を作成する。
前の文で完成しました。データベースに接続して、基礎表が10枚あります。
A UTH_のような表を見てください。GROUTP表では、IDフィールドが12 c特有のゲナート文法を使っていることが分かりました。DJ ANGO_を除いてSESSION以外に、他の表には自己増加シーケンスのidフィールドがメインキーとしてあります。
djangoユーザーデータベースをエクスポートします。11 gバージョンを使用してください。
11 gデータベースに導入して、とても順調です。
AUTHをまた見ますGROUTP表では、表の構造は同じであることが分かりましたが、idの上の自増シーケンスのデフォルト値はなくなりました。
settingsファイルを修正して、Oracle 11 gまで接続して、djangoサービスを起動します。
しかし、adminユーザーのパスワードを作成するとエラーが発生します。ORA-01400:cannot insert NULL into(DJ ANGO).「AUTH_」USER"."ID"
明らかにAUTH_に挿入します。USERテーブルの場合はIDの値は指定されていませんが、IDはメインキーで、空ではありません。
12 cの環境下では、このIDはブートシーケンスですので、insert文ではこの値を指定する必要はありません。
ソリューション
ソリューションも出荷されます。ID列ごとに11 gのシーケンスを作成し、フリップフロップを作成し、データを挿入する時にID値を補えばいいです。
(1)シーケンスを生成します。
sql文を使う
SQL文で
新規ユーザーのlurenjiaが成功しました。
以上のdjango 2.2連oracle 11 gに基づいてバージョンの衝突を解決する問題は小編がみんなのすべての内容に分かち合うので、みんなに1つの参考をあげることができることを望んで、みんながよけいに私達を支持することをも望みます。
この衝突は他の方法で解決できますか?解決策を考えて、実践してみました。
django 2.2でOracle 12 cの環境の下でmigrateをして、基礎表を作ります。
ベーステーブルをエクスポートしてOracle 11 gデータベースに導入します。
django 2.2でOracle 11 gまでです。
実施の手順
1、django 2.2でOracle 12 cの環境下でmigrateを作り、基礎表を作成する。
前の文で完成しました。データベースに接続して、基礎表が10枚あります。
A UTH_のような表を見てください。GROUTP表では、IDフィールドが12 c特有のゲナート文法を使っていることが分かりました。DJ ANGO_を除いて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.ベーステーブルをエクスポートし、Oracle 11 gデータベースに導入するdjangoユーザーデータベースをエクスポートします。11 gバージョンを使用してください。
11 gデータベースに導入して、とても順調です。
AUTHをまた見ますGROUTP表では、表の構造は同じであることが分かりましたが、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、django 2.2でOracle 11 gを連結する。settingsファイルを修正して、Oracle 11 gまで接続して、djangoサービスを起動します。
しかし、adminユーザーのパスワードを作成するとエラーが発生します。ORA-01400:cannot insert NULL into(DJ ANGO).「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はメインキーで、空ではありません。
12 cの環境下では、このIDはブートシーケンスですので、insert文ではこの値を指定する必要はありません。
ソリューション
ソリューションも出荷されます。ID列ごとに11 gのシーケンスを作成し、フリップフロップを作成し、データを挿入する時に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が成功しました。
以上のdjango 2.2連oracle 11 gに基づいてバージョンの衝突を解決する問題は小編がみんなのすべての内容に分かち合うので、みんなに1つの参考をあげることができることを望んで、みんながよけいに私達を支持することをも望みます。