FYP-eVision / database_table_creation.py
database_table_creation.py
Raw
# Developer Name: Soh Wee Liam
# Intake: UC3F2111CS(IS)
# Program Name: To initialize the database schema and table creation in the AWS RDS
# Date Created: 29/04/2022
from pickle import FALSE, TRUE
import pymysql
from pymysql.constants import CLIENT

# Create connection to the AWS RDS Free Tier created
db = pymysql.connect(
    host='mydatabase.cdkg8rguncrh.ap-southeast-1.rds.amazonaws.com',
    user='admin',
    password='%Abc040231',
    client_flag=CLIENT.MULTI_STATEMENTS
)
if(db):
    print("Connection Successful")
else:
    print("Connetion Unsucessful")
cursor = db.cursor()

# Check if database schema existed
exist = FALSE
cursor.execute('Show databases')
for db in cursor:
  if(db[0] == 'eVision'):
    print("Database Existed!\n")
    exist = TRUE
    break
  else:
    print("Database Not Exist!\n")

if(exist == FALSE):
  # If database was not found, create the database & table
  # Create and use the database schema
  sql = '''CREATE DATABASE eVision'''
  cursor.execute(sql)
  cursor.connection.commit()
  cursor.execute('USE eVision')
  
  # Create User table and insert a default admin
  sql = '''
  CREATE TABLE User_seq
  (
    user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
  CREATE TABLE User (
      user_id CHAR(5) NOT NULL DEFAULT '0',
      user_firstname VARCHAR(30) NOT NULL,
      user_lastname VARCHAR(30) NOT NULL,
      user_password CHAR(64) NOT NULL,
      user_addressline VARCHAR(255) NOT NULL,
      user_city VARCHAR(30) NOT NULL,
      user_state VARCHAR(30) NOT NULL,
      user_postcode VARCHAR(5) NOT NULL,
      user_email VARCHAR(255) NOT NULL,
      user_phone VARCHAR(15) NOT NULL,
      user_role TINYINT(1) NOT NULL DEFAULT '2',
      user_avatar VARCHAR(255) NOT NULL DEFAULT '1cqBLIEBhkWQ1qmRSi1UehZ7pYKeGQm8e',
      user_lastlogin_datetime DATETIME NULL,
      user_firstLogin TINYINT(1) NOT NULL DEFAULT '1',
      user_isDelete TINYINT(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (user_id)
      );
  CREATE TRIGGER tg_User_insert
  BEFORE INSERT ON User
  FOR EACH ROW
  BEGIN
    INSERT INTO User_seq VALUES (NULL);
    SET NEW.user_id = CONCAT('U', LPAD(LAST_INSERT_ID(), 4, '0'));
  END;
  INSERT INTO User (user_firstname, user_lastname, user_password, user_addressline, user_city, user_state, user_postcode, user_email, user_phone, user_role, user_firstLogin)
  SELECT * FROM (SELECT 'Admin', 'Default', SHA2('admin1010', 256), 'Level 20, Axiata Tower, Jalan Stesen Sentral 5', 'Kuala Lumpur Sentral', 'Kuala Lumpur', '50470', 'evisionmalaysia@gmail.com', '012-3456789', 1, 0) AS tmp
  WHERE NOT EXISTS (
      SELECT user_firstname FROM User WHERE user_firstname = 'Admin'
  ) LIMIT 1;
  '''
  cursor.execute(sql)


  # Create Camera table
  sql = '''
  CREATE TABLE Camera_seq
  (
    cam_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
  CREATE TABLE Camera (
      cam_id CHAR(5) NOT NULL DEFAULT '0',
      cam_desc VARCHAR(255) NULL,
      cam_type VARCHAR(30) NOT NULL,
      cam_source VARCHAR(255) NOT NULL,
      cam_street VARCHAR(255) NOT NULL,
      cam_city VARCHAR(30) NOT NULL,
      cam_state VARCHAR(30) NOT NULL,
      cam_latitude DECIMAL(10,8) NOT NULL,
      cam_longitude DECIMAL(11,8) NOT NULL,
      cam_isDelete TINYINT(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (cam_id)
      );
  CREATE TRIGGER tg_Camera_insert
  BEFORE INSERT ON Camera
  FOR EACH ROW
  BEGIN
    INSERT INTO Camera_seq VALUES (NULL);
    SET NEW.cam_id = CONCAT('C', LPAD(LAST_INSERT_ID(), 4, '0'));
  END;
  '''
  cursor.execute(sql)
  
  # Create User_Camera table
  sql = '''
  CREATE TABLE User_Camera (
      user_id CHAR(5) NOT NULL,
      cam_id CHAR(5) NOT NULL,
      FOREIGN KEY (user_id) REFERENCES User(user_id),
      FOREIGN KEY (cam_id) REFERENCES Camera(cam_id)
    );
  '''
  cursor.execute(sql)
  
  # Create Review table
  sql = '''
  CREATE TABLE Review_seq
  (
    rev_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
  CREATE TABLE Review (
      rev_id CHAR(5) NOT NULL DEFAULT '0',
      user_id CHAR(5) NOT NULL,
      rev_datetime DATETIME NOT NULL,
      rev_isAccident TINYINT(1) NOT NULL,
      PRIMARY KEY (rev_id),
      FOREIGN KEY (user_id) REFERENCES User(user_id)
  );  
  CREATE TRIGGER tg_Review_insert
  BEFORE INSERT ON Review
  FOR EACH ROW
  BEGIN
    INSERT INTO Review_seq VALUES (NULL);
    SET NEW.rev_id = CONCAT('R', LPAD(LAST_INSERT_ID(), 4, '0'));
  END;
  '''
  cursor.execute(sql)
  
  # create AccidentDetected table
  sql = '''
  CREATE TABLE DetectedAccident_seq
  (
    acci_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
  CREATE TABLE DetectedAccident (
      acci_id CHAR(5) NOT NULL DEFAULT '0',
      cam_id CHAR(5) NOT NULL,
      rev_id CHAR(5) NULL,
      acci_datetime DATETIME NOT NULL,
      acci_proof VARCHAR(255) NOT NULL,
      PRIMARY KEY (acci_id),
      FOREIGN KEY (cam_id) REFERENCES Camera(cam_id),
      FOREIGN KEY (rev_id) REFERENCES Review(rev_id)
  );  
  CREATE TRIGGER tg_DetectedAccident_insert
  BEFORE INSERT ON DetectedAccident
  FOR EACH ROW
  BEGIN
    INSERT INTO DetectedAccident_seq VALUES (NULL);
    SET NEW.acci_id = CONCAT('A', LPAD(LAST_INSERT_ID(), 4, '0'));
  END;
  '''
  cursor.execute(sql)
  print("The eVision database schema created successfully!")
else:
  print("The database schema already existed!")