๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Python/ETC

Django Oracle11g ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•

by ๐ŸŒปโ™š 2021. 10. 5.

Django Oracle11g ์—ฐ๋™

Django ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉํ•  ๋•Œ Oracle ๋ฒ„์ „์— ๋Œ€ํ•œ Dependency๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://docs.djangoproject.com/en/2.0/releases/2.0/#dropped-support-for-oracle-11-2

 

Django 2.0 release notes | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

Django 2.0๋ถ€ํ„ฐ Oracle11g์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2.X Python๋„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Django ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•œ ๊ฐœ๋ฐœ ์‹œ Oracle Database๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฒ„์ „ Dependency์—๋Œ€ํ•ด์„œ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

Django Oracle11g ์—ฐ๋™ ํŽธ๋ฒ•

ํ•˜์ง€๋งŒ Django 2.X ๋ฒ„์ „์—์„œ Oracle11g๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฒ•์ด ํ•œ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.

Django 2.X์—์„œ Oracle12c ์ด์ƒ์„ ์ง€์›ํ•˜๋Š” ์ด์œ ๋Š” SQL ๋ฌธ๋ฒ•์ด ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Django์˜ Model์„ ๋‹ค๋ฃฐ ๋•Œ Oracle12c์—์„œ ์ง€์›ํ•˜๊ณ  Oracle11g์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Django 2.X์—์„œ Oracle11g๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • manage.py migrate ํ• ๋•Œ SQL๋ฌธ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
    • ๊ทธ๋ž˜์„œ django admin์— ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”๋“ค์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Oracle11g์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์ •์— ๋ฏธ๋ฆฌ django admin์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ‚ค๋งˆ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

 

Django 1.11 ์„ค์น˜ ํ›„ 2.X ์„ค์น˜

๋งŒ์•ฝ Oracle11g๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด Django 1.11์„ ๋จผ์ € ์„ค์น˜ํ•˜๊ณ  migrate์„ ์ง„ํ–‰ํ•ด์„œ admin ํ…Œ์ด๋ธ”๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  Django 2.X๋กœ ๋‹ค์‹œ ์„ค์น˜ํ•ด์„œ ์ง„ํ–‰ํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

DDL Script ์ถ”์ถœ ํ›„ ์ ์šฉ

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ Oracle12c์—์„œ ์ ์šฉ๋œ ํ…Œ์ด๋ธ”๋“ค์„ Oracle11g์— ๋งž๊ฒŒ DDL ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • Python 3.9.6
  • Django 2.2.24
  • Oracle11g
  • cx_Oracle 8.2

์•„๋ž˜ Script๋Š” ์œ„์˜ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•œ ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค. Oracle12c์—์„œ ์ถ”์ถœํ•˜๊ณ  Oracle11g์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

/*
django 2.X ๋ฒ„์ „์—์„œ๋Š” oracle 12c ์ด์ƒ ๋ฒ„์ „๋งŒ ์ง€์›ํ•œ๋‹ค.
oracle 11g๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด django admin ์Šคํ‚ค๋งˆ๋ฅผ ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

ํ•˜์œ„ ํ…Œ์ด๋ธ”๋“ค์— ๋Œ€ํ•œ ์Šคํ‚ค๋งˆ ์ƒ์„ฑ
AUTH_GROUP
DJANGO_CONTENT_TYPE
AUTH_PERMISSION
AUTH_GROUP_PERMISSIONS
DJANGO_MIGRATIONS
DJANGO_SESSION
AUTH_USER
DJANGO_ADMIN_LOG
AUTH_USER_GROUPS
AUTH_USER_USER_PERMISSIONS
*/


--AUTH_GROUP
CREATE TABLE "AUTH_GROUP"(
    "ID" NUMBER(11,0)  NOT NULL ENABLE,
	"NAME" NVARCHAR2(150),
	PRIMARY KEY ("ID"),
	UNIQUE ("NAME")
);

CREATE SEQUENCE "AUTH_GROUP_SEQ"
    MINVALUE 1
    MAXVALUE 999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

CREATE OR REPLACE TRIGGER "AUTH_GROUP_TR"
BEFORE INSERT ON "AUTH_GROUP"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "AUTH_GROUP_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "AUTH_GROUP_TR" ENABLE;


--DJANGO_CONTENT_TYPE
CREATE TABLE "DJANGO_CONTENT_TYPE"(
    "ID" NUMBER(11,0) NOT NULL ENABLE,
	"APP_LABEL" NVARCHAR2(100),
	"MODEL" NVARCHAR2(100),
	PRIMARY KEY ("ID"),
	CONSTRAINT "DJANGO_CO_APP_LABEL_76BD3D3B_U" UNIQUE ("APP_LABEL", "MODEL")
);

CREATE SEQUENCE "DJANGO_CONTENT_TYPE_SEQ"
    MINVALUE 1
    MAXVALUE 999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

CREATE OR REPLACE TRIGGER "DJANGO_CONTENT_TYPE_TR"
BEFORE INSERT ON "DJANGO_CONTENT_TYPE"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "DJANGO_CONTENT_TYPE_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "DJANGO_CONTENT_TYPE_TR" ENABLE;


--AUTH_PERMISSION
CREATE TABLE "AUTH_PERMISSION"(
    "ID" NUMBER(11,0) NOT NULL ENABLE,
	"NAME" NVARCHAR2(255),
	"CONTENT_TYPE_ID" NUMBER(11,0) NOT NULL ENABLE,
	"CODENAME" NVARCHAR2(100),
	PRIMARY KEY ("ID"),
 	CONSTRAINT "AUTH_PERM_CONTENT_T_01AB375A_U" UNIQUE ("CONTENT_TYPE_ID", "CODENAME"),
    CONSTRAINT "AUTH_PERM_CONTENT_T_2F476E4B_F" FOREIGN KEY ("CONTENT_TYPE_ID")
	    REFERENCES "DJANGO_CONTENT_TYPE" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE
);

CREATE INDEX "AUTH_PERMI_CONTENT_TY_2F476E4B" ON "AUTH_PERMISSION" ("CONTENT_TYPE_ID");

CREATE SEQUENCE "AUTH_PERMISSION_SEQ"
    MINVALUE 1
    MAXVALUE 999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

CREATE OR REPLACE TRIGGER "AUTH_PERMISSION_TR"
BEFORE INSERT ON "AUTH_PERMISSION"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "AUTH_PERMISSION_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "AUTH_PERMISSION_TR" ENABLE;


--AUTH_GROUP_PERMISSION
CREATE TABLE "AUTH_GROUP_PERMISSIONS"(
	"ID" NUMBER(11,0) NOT NULL ENABLE,
	"GROUP_ID" NUMBER(11,0) NOT NULL ENABLE,
	"PERMISSION_ID" NUMBER(11,0) NOT NULL ENABLE,
	PRIMARY KEY ("ID"),
	CONSTRAINT "AUTH_GROU_GROUP_ID__0CD325B0_U" UNIQUE ("GROUP_ID", "PERMISSION_ID"),
	CONSTRAINT "AUTH_GROU_GROUP_ID_B120CBF9_F" FOREIGN KEY ("GROUP_ID")
	    REFERENCES "AUTH_GROUP" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
	CONSTRAINT "AUTH_GROU_PERMISSIO_84C5C92E_F" FOREIGN KEY ("PERMISSION_ID")
	    REFERENCES "AUTH_PERMISSION" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE
);

CREATE INDEX "AUTH_GROUP_GROUP_ID_B120CBF9" ON "AUTH_GROUP_PERMISSIONS" ("GROUP_ID");
CREATE INDEX "AUTH_GROUP_PERMISSION_84C5C92E" ON "AUTH_GROUP_PERMISSIONS" ("PERMISSION_ID");

CREATE SEQUENCE "AUTH_GROUP_PERMISSIONS_SEQ" 
    MINVALUE 1 
    MAXVALUE 999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20;

CREATE OR REPLACE TRIGGER "AUTH_GROUP_PERMISSIONS_TR"
BEFORE INSERT ON "AUTH_GROUP_PERMISSIONS"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "AUTH_GROUP_PERMISSIONS_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "AUTH_GROUP_PERMISSIONS_TR" ENABLE;


--DJANGO_MIGRATIONS
CREATE TABLE "DJANGO_MIGRATIONS"(
	"ID" NUMBER(11,0) NOT NULL ENABLE,
	"APP" NVARCHAR2(255),
	"NAME" NVARCHAR2(255),
	"APPLIED" TIMESTAMP (6) NOT NULL ENABLE,
	PRIMARY KEY ("ID")
);

CREATE SEQUENCE "DJANGO_MIGRATIONS_SEQ" 
    MINVALUE 1 
    MAXVALUE 999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20;

CREATE OR REPLACE TRIGGER "DJANGO_MIGRATIONS_TR"
BEFORE INSERT ON "DJANGO_MIGRATIONS"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "DJANGO_MIGRATIONS_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "DJANGO_MIGRATIONS_TR" ENABLE;


--DJANGO_SESSION
CREATE TABLE "DJANGO_SESSION"(
    "SESSION_KEY" NVARCHAR2(40) NOT NULL ENABLE,
	"SESSION_DATA" NCLOB,
	"EXPIRE_DATE" TIMESTAMP (6) NOT NULL ENABLE,
	PRIMARY KEY ("SESSION_KEY")
);

CREATE INDEX "DJANGO_SES_EXPIRE_DAT_A5C62663" ON "DJANGO_SESSION" ("EXPIRE_DATE");


--AUTH_USER
CREATE TABLE "AUTH_USER"(
	"ID" NUMBER(11,0) NOT NULL ENABLE,
	"PASSWORD" NVARCHAR2(128),
	"LAST_LOGIN" TIMESTAMP (6),
	"IS_SUPERUSER" NUMBER(1,0) NOT NULL ENABLE,
	"USERNAME" NVARCHAR2(150),
	"FIRST_NAME" NVARCHAR2(30),
	"LAST_NAME" NVARCHAR2(150),
	"EMAIL" NVARCHAR2(254),
	"IS_STAFF" NUMBER(1,0) NOT NULL ENABLE,
	"IS_ACTIVE" NUMBER(1,0) NOT NULL ENABLE,
	"DATE_JOINED" TIMESTAMP (6) NOT NULL ENABLE,
	CHECK ("IS_SUPERUSER" IN (0,1)) ENABLE,
	CHECK ("IS_STAFF" IN (0,1)) ENABLE,
	CHECK ("IS_ACTIVE" IN (0,1)) ENABLE,
	PRIMARY KEY ("ID"),
	UNIQUE ("USERNAME")
);

CREATE SEQUENCE "AUTH_USER_SEQ" 
    MINVALUE 1 
    MAXVALUE 999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20;

CREATE OR REPLACE TRIGGER "AUTH_USER_TR"
BEFORE INSERT ON "AUTH_USER"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "AUTH_USER_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "AUTH_USER_TR" ENABLE;


--DJANGO_ADMIN_LOG
CREATE TABLE "DJANGO_ADMIN_LOG"(
	"ID" NUMBER(11,0) NOT NULL ENABLE,
	"ACTION_TIME" TIMESTAMP (6) NOT NULL ENABLE,
	"OBJECT_ID" NCLOB,
	"OBJECT_REPR" NVARCHAR2(200),
	"ACTION_FLAG" NUMBER(11,0) NOT NULL ENABLE,
	"CHANGE_MESSAGE" NCLOB,
	"CONTENT_TYPE_ID" NUMBER(11,0),
	"USER_ID" NUMBER(11,0) NOT NULL ENABLE,
	CHECK ("ACTION_FLAG" >= 0) ENABLE,
	PRIMARY KEY ("ID"),
	CONSTRAINT "DJANGO_AD_CONTENT_T_C4BCE8EB_F" FOREIGN KEY ("CONTENT_TYPE_ID")
	    REFERENCES "DJANGO_CONTENT_TYPE" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
	CONSTRAINT "DJANGO_AD_USER_ID_C564EBA6_F" FOREIGN KEY ("USER_ID")
	    REFERENCES "AUTH_USER" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE
);

CREATE INDEX "DJANGO_ADM_CONTENT_TY_C4BCE8EB" ON "DJANGO_ADMIN_LOG" ("CONTENT_TYPE_ID");
CREATE INDEX "DJANGO_ADM_USER_ID_C564EBA6" ON "DJANGO_ADMIN_LOG" ("USER_ID");

CREATE SEQUENCE "DJANGO_ADMIN_LOG_SEQ" 
    MINVALUE 1 
    MAXVALUE 999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20;

CREATE OR REPLACE TRIGGER "DJANGO_ADMIN_LOG_TR"
BEFORE INSERT ON "DJANGO_ADMIN_LOG"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "DJANGO_ADMIN_LOG_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "DJANGO_ADMIN_LOG_TR" ENABLE;


--AUTH_USER_GROUPS
CREATE TABLE "AUTH_USER_GROUPS"(
	"ID" NUMBER(11,0) NOT NULL ENABLE,
	"USER_ID" NUMBER(11,0) NOT NULL ENABLE,
	"GROUP_ID" NUMBER(11,0) NOT NULL ENABLE,
	PRIMARY KEY ("ID"),
	CONSTRAINT "AUTH_USER_USER_ID_G_94350C0C_U" UNIQUE ("USER_ID", "GROUP_ID"),
	CONSTRAINT "AUTH_USER_USER_ID_6A12ED8B_F" FOREIGN KEY ("USER_ID")
	    REFERENCES "AUTH_USER" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
	CONSTRAINT "AUTH_USER_GROUP_ID_97559544_F" FOREIGN KEY ("GROUP_ID")
	    REFERENCES "AUTH_GROUP" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE
);

CREATE INDEX "AUTH_USER__USER_ID_6A12ED8B" ON "AUTH_USER_GROUPS" ("USER_ID");
CREATE INDEX "AUTH_USER__GROUP_ID_97559544" ON "AUTH_USER_GROUPS" ("GROUP_ID");

CREATE SEQUENCE "AUTH_USER_GROUPS_SEQ" 
    MINVALUE 1 
    MAXVALUE 999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20;

CREATE OR REPLACE TRIGGER "AUTH_USER_GROUPS_TR"
BEFORE INSERT ON "AUTH_USER_GROUPS"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "AUTH_USER_GROUPS_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "AUTH_USER_GROUPS_TR" ENABLE;


--AUTH_USER_USER_PERMISSIONS
CREATE TABLE "AUTH_USER_USER_PERMISSIONS"(
	"ID" NUMBER(11,0)  NOT NULL ENABLE,
	"USER_ID" NUMBER(11,0) NOT NULL ENABLE,
	"PERMISSION_ID" NUMBER(11,0) NOT NULL ENABLE,
	PRIMARY KEY ("ID"),
	CONSTRAINT "AUTH_USER_USER_ID_P_14A6B632_U" UNIQUE ("USER_ID", "PERMISSION_ID"),
	CONSTRAINT "AUTH_USER_USER_ID_A95EAD1B_F" FOREIGN KEY ("USER_ID")
	    REFERENCES "AUTH_USER" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
	CONSTRAINT "AUTH_USER_PERMISSIO_1FBB5F2C_F" FOREIGN KEY ("PERMISSION_ID")
	    REFERENCES "AUTH_PERMISSION" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE
);

CREATE INDEX "AUTH_USER__USER_ID_A95EAD1B" ON "AUTH_USER_USER_PERMISSIONS" ("USER_ID");
CREATE INDEX "AUTH_USER__PERMISSION_1FBB5F2C" ON "AUTH_USER_USER_PERMISSIONS" ("PERMISSION_ID");

CREATE SEQUENCE "AUTH_USER_USER_PERMISSIONS_SEQ" 
    MINVALUE 1 
    MAXVALUE 999999999 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 20;

CREATE OR REPLACE TRIGGER "AUTH_USER_USER_PERMISSIONS_TR"
BEFORE INSERT ON "AUTH_USER_USER_PERMISSIONS"
FOR EACH ROW
WHEN (new."ID" IS NULL) BEGIN
	SELECT "AUTH_USER_USER_PERMISSIONS_SEQ".nextval
	INTO :new."ID" FROM dual;
END;

ALTER TRIGGER "AUTH_USER_USER_PERMISSIONS_TR" ENABLE;

Django 2.X, Oracle11gํ™˜๊ฒฝ์—์„œ ์œ„์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ ์šฉํ•ด์ฃผ๊ณ  ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด์ค€๋‹ค๋ฉด admin์— ๋ฐ”๋กœ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฃผ์˜์‚ฌ์šฉ

๋‹จ, ์—ฌ์ „ํžˆ Django 2.X๋ฒ„์ „์—์„œ๋Š” Oracle11g๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— manage.py์—์„œ ์‚ฌ์šฉ๋˜๋Š” migrate์™€ ๊ฐ™์€ ๋ช…๋ น์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•ด์„œ ์‚ฌ์šฉํ• ์ˆ˜๋Š” ์žˆ์ง€๋งŒ... Django์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ช…๋ น๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

๋Œ“๊ธ€