Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Proect/DB_constraints.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
This block contains constraint creation,
such as FOREIGN KEYs, CHECKs etc.
*/
ALTER TABLE orders
ADD CONSTRAINT check_orders_price
CHECK (price > 0);

ALTER TABLE comments
ADD CONSTRAINT check_comment_rate
CHECK (film_rate > 0);

ALTER TABLE app_user
ADD CONSTRAINT check_user_num
CHECK (orders_num > 0);

ALTER TABLE dish
ADD CONSTRAINT check_dish_num
CHECK (orders_num > 0);

/*
ENDBLOCK
*/
168 changes: 168 additions & 0 deletions Proect/DB_triggers.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/*
This block dedicated to triggers
*/
/*
This sub-block contains group of triggers
that auto-generate ids for whole group of tables
*/
/*Comment table validation*/

CREATE SEQUENCE pk1_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

CREATE OR REPLACE TRIGGER pk_comment_id
BEFORE INSERT ON comments
FOR EACH ROW
WHEN ( new.comment_id IS NULL )
BEGIN
:new.comment_id := pk1_seq.nextval;
END;
/
/*App_user table validation*/

CREATE SEQUENCE pk2_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

CREATE OR REPLACE TRIGGER user_id_trigg
BEFORE INSERT ON app_user
FOR EACH ROW
WHEN ( new.user_id IS NULL )
BEGIN
:new.user_id := pk2_seq.nextval;
IF :new.user_age < 0
THEN
raise_application_error(-20015,'User age is not valid!');
END IF;
IF :new.user_mail NOT LIKE '%@%.%'
THEN
raise_application_error(-20001,'User mail is not valid!');
END IF;
IF :new.user_phone NOT LIKE '+%'
THEN
raise_application_error(-20003,'User phone number is not valid!');
END IF;
IF (LENGTH(TRIM(:new.user_bank)) > 19 OR LENGTH(TRIM(:new.user_bank)) < 13)
THEN
raise_application_error(-20004,'User bank number is not valid!');
END IF;
END;
/


/*Films table validation*/
CREATE SEQUENCE pk6_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

CREATE OR REPLACE TRIGGER pk_dish_id
BEFORE INSERT ON dishes
FOR EACH ROW
WHEN ( new.dishes_id IS NULL )
BEGIN
:new.dish_id := pk6_seq.nextval;
END;
/

/*Snack table validation*/
CREATE SEQUENCE pk7_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

CREATE OR REPLACE TRIGGER pk_snack_id
BEFORE INSERT ON snack
FOR EACH ROW
WHEN ( new.snack_id IS NULL )
BEGIN
:new.snack_id := pk7_seq.nextval;
END;
/
/*Orders table validation*/

CREATE SEQUENCE pk3_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

CREATE OR REPLACE TRIGGER order_trigg
BEFORE INSERT ON orders
FOR EACH ROW
WHEN ( new.order_id IS NULL )
BEGIN
/*Updating number of orders while insert*/
UPDATE app_user
SET orders_num = (SELECT orders_num
FROM app_user
WHERE user_id = :new.user_id) + 1
WHERE user_id = :new.user_id;
UPDATE dishes
SET orders_num = (SELECT orders_num
FROM dishes
WHERE dish_id = :new.dish_id) + 1
WHERE diah_id = :new.film_id;

IF :new.snack_id IS NOT NULL
THEN
UPDATE snack
SET orders_num = (SELECT orders_num
FROM snack
WHERE snack_id = :new.snack_id) + 1
WHERE snack_id = :new.snack_id;
END IF;
:new.order_id := pk3_seq.nextval;
END;
/

/*Ticket table validation*/
CREATE SEQUENCE pk4_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;


CREATE OR REPLACE TRIGGER us_age
BEFORE INSERT ON orders
FOR EACH ROW
DECLARE
us_ag NUMBER(38,0);
v_age NUMBER(38,0);
BEGIN
SELECT user_age INTO us_ag FROM app_user WHERE user_id = :new.user_id;
SELECT age_constraint INTO v_age FROM films WHERE film_id = :new.film_id;
IF (us_ag < v_age)
THEN raise_application_error(-20010,'User age is not valid');
END IF;
END;
/

CREATE OR REPLACE TRIGGER user_age_apdate
BEFORE UPDATE ON app_user
FOR EACH ROW
BEGIN
IF :old.user_age < :new.user_age
THEN
raise_application_error(-20011,'User age cant be changed');
END IF;
END;
/
/*
END SUB-BLOCK
*/

/*
ANOUTHER SUB-BLOCKS IN PROGRESS
*/
/*
ENDBLOCK
*/
72 changes: 72 additions & 0 deletions Proect/OracleDb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import cx_Oracle
import datetime
from credentials import *
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


class OracleDb(object):
_instance = None

def __new__(cls):
if cls._instance is None:
cls._instance = object.__new__(cls)
try:
connection = cx_Oracle.connect(username, password, databaseName)
cursor = connection.cursor()

# execute a statement
cursor.execute('SELECT * FROM v$version')

# display the PostgreSQL database server version
db_version = cursor.fetchone()
print("New connection to {} created".format(db_version[0]))
oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{host}:{port}/{sid}'
engine = create_engine(oracle_connection_string.format(username="PMA_KM_20", password="oracle_2", sid="XE", host="localhost", port="1521", database="PMA_KM_20"))

Session = sessionmaker(bind=engine)
session = Session()

OracleDb._instance.sqlalchemy_session = session
OracleDb._instance.sqlalchemy_engine = engine
OracleDb._instance.connection = connection
OracleDb._instance.cursor = cursor

except Exception as error:
print('Error: connection not established {}'.format(error))

return cls._instance

def __init__(self):
oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{host}:{port}/{sid}'
engine = create_engine(oracle_connection_string.format(username=username, password=password, sid=service_name, host=ip, port=port, database=databaseName))

Session = sessionmaker(bind=engine)
session = Session()

self.sqlalchemy_session = session
self.sqlalchemy_engine = engine
self.connection = self._instance.connection
self.cursor = self._instance.cursor

def execute(self, query):
'''
Функція, що дозволяє робити
запити з бд
'''
try:
result = self.cursor.execute(query)
self.connection.commit()
except Exception as error:
print('error execting query "{}", error: {}'.format(query, error))
return None
else:
return result

def __del__(self):
self.sqlalchemy_session.close()


if __name__ == "__main__":
# створюємо екземпляр класу ОраклДб
db = OracleDb()
20 changes: 20 additions & 0 deletions Proect/credentials.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import cx_Oracle

username = 'PMA_KM_20'
password = 'oracle_2'
ip = 'localhost'
port = 1521
service_name = 'XE'
dsn = cx_Oracle.makedsn(ip, port, service_name=service_name)
databaseName = dsn

DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'PMA_KM_20'
PASSWORD = 'oracle_2'

HOST = 'localhost'
PORT = 1521
SERVICE = 'orcl'

ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
Loading