Introduction To Python
Introduction To Python
Easy to code: Python is a high-level programming language, and it is very easy to code.
It is also a developer-friendly language.
Free and Open Source: Python is freely available. You can download it from the
Python Official Website. Secondly, it is open source. This means that its source code is
available to the public. You can download it, change it, use it, and distribute it.
GUI Programming Support: Graphical User interfaces can be made using a module
such as PyQt5, PyQt4, python, or Tk in python.
Extensible feature: If needed, you can write some of your Python code in other
languages like C++. This makes Python an extensible language, meaning that it can be
extended to other languages.
Python is Portable language: Python language is also a portable language. For
example, if we have python code for windows and if we want to run this code on other
platforms such as Linux, Unix, and Mac then we do not need to change it, we can run this
code on any platform.
Large Standard Library: Python has a large standard library which provides a rich set
of modules and functions, so you do not have to write your own code for every single
thing. There are many libraries present in python for such as regular expressions, web
browsers, etc.
Dynamically Typed Language: Python is dynamically typed. This means that the
type for a value is decided at runtime, not in advance. Therefore, we don't need to specify
the type of data while declaring it.
A table is a collection of data about a specific topic, such as products or suppliers. Using
a separate table for each topic means you can store that data only once, which makes your
database more efficient and reduces data-entry errors. Table organizes data into columns
(called fields) and rows (called records).
A Primary key is one or more fields whose value or values uniquely identify each record
in a table. In a relationship, a primary key is used to refer to a specific record in one table
from another table. A foreign key is a column in a relational database table that provides
a link between data in two tables. It acts as a cross-reference between tables because it
references the primary key of another table, thereby establishing a link between them.
ROLE OF RDBMS APPLICATION PROGRAM:
A computer database works as an electronic filing system, which has a large number of
ways of cross-referencing, and this allows the user many different ways in which to re-
organize and retrieve data. A database can handle business inventory, accounting and
filing and use the information in its files to prepare summaries, estimates and other
reports. The management of data in a database system is done by means of a general-
purpose software package called a Database Management System (DBMS). Some
commercially available DBMSS are MS SQL Server, MS ACCESS, INGRES, ORACLE,
and Sybase. A database management system, therefore, is a combination of hardware and
software that can be used to set up and monitor a database and can manage the updating
and retrieval of databases that have been stored in it. Most of the database management
systems have the following capabilities:
The data stored can be sorted or indexed at the user's discretion and direction.
Various reports can be produced from the system. These may be either
Mathematical functions can be performed, and the data stored in the database can be
manipulated with these functions to perform the desired calculations.
Easy to use: MySQL is easy to use. We must get only the basic knowledge of SQL. We
can build and interact with MySQL by using only a few simple SQL statements.
Secure: It consists of a solid data security layer that protects sensitive data from
intruders. Also, passwords are encrypted in MySQL.
Free to download: It is free to use so that we can download it from MySQL official
website without any cost.
Allows roll-back: It allows transactions to be rolled back, commit, and crash recovery.
Memory efficiency: Its efficiency is high because it has a very low memory leakage
problem.
High Performance: It is faster, more reliable, and cheaper because of its unique
storage engine architecture. It provides very high-performance results in: -
o High Productivity: MySQL uses Triggers, Stored procedures, and views that
allow the developer to give higher productivity.
1. Login: This module has 2 options, and we must select either ADMIN or USER. The
admin has all the rights in the software including updating the status of the site. The
Other fields in login are username and password. If the username and password are
correct, then it is directed accordingly.
2. New User: This module is for the users who do not have an account. Here the user is
allowed to create an account to login. The account creation is done by filling in the
registration form with user details such as name, phone, email etc.
Search: This module helps the customer to ease the search based on its budget or
interest. The search can be done on different categories like mobile model name model
number, color, price etc.
SOURCE CODE: -
DELIMITER //
CREATE PROCEDURE SP_DBSCHEMACOMPARE_WITHIN_CLUSTER (SOURCEDBNAME VARCHAR(64),
DESTINATIONDBNAME VARCHAR(64))
BEGIN
SET @SOURCEDBNAME = SOURCEDBNAME COLLATE utf8_tolower_ci, @DESTINATIONDBNAME =
DESTINATIONDBNAME COLLATE utf8_tolower_ci;
-- Gets the columns, which are not part of any missing table, exist in source
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.COLUMN_NAME, 'Column', CONCAT('Column exists only in source
database `', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, NULL, NULL
FROM INFORMATION_SCHEMA.COLUMNS S
INNER JOIN INFORMATION_SCHEMA.TABLES T ON S.TABLE_NAME = T.TABLE_NAME AND T.TABLE_SCHEMA
= @DESTINATIONDBNAME
LEFT OUTER JOIN INFORMATION_SCHEMA.COLUMNS D ON D.TABLE_SCHEMA = @DESTINATIONDBNAME
AND S.TABLE_NAME = D.TABLE_NAME AND S.COLUMN_NAME = D.COLUMN_NAME
WHERE S.TABLE_SCHEMA = @SOURCEDBNAME
AND D.COLUMN_NAME IS NULL;
-- Gets the columns, which are not part of any missing table, exist in destination
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.COLUMN_NAME, 'Column', CONCAT('Column exists only in
destination database `', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, NULL, NULL
FROM INFORMATION_SCHEMA.COLUMNS S
INNER JOIN INFORMATION_SCHEMA.TABLES T ON S.TABLE_NAME = T.TABLE_NAME AND T.TABLE_SCHEMA
= @SOURCEDBNAME
LEFT OUTER JOIN INFORMATION_SCHEMA.COLUMNS D ON D.TABLE_SCHEMA = @SOURCEDBNAME AND
S.TABLE_NAME = D.TABLE_NAME AND S.COLUMN_NAME = D.COLUMN_NAME
WHERE S.TABLE_SCHEMA = @DESTINATIONDBNAME
AND D.COLUMN_NAME IS NULL;
);
-- AND SHA2(CONCAT(S.COLUMN_DEFAULT, description), 256) = SHA2(CONCAT(name, description), 256);
-- Gets the Indexes, which are not associated with constraints, exist only in destination
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, 'Index', CONCAT('Index exists only in destination
database `', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, GROUP_CONCAT( "`", COALESCE(S.COLUMN_NAME
COLLATE utf8_unicode_ci ,S.EXPRESSION COLLATE utf8_unicode_ci ), "`", CASE WHEN S.COLLATION COLLATE
utf8_unicode_ci = 'D' THEN ' DESC ' ELSE '' END, COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT
COLLATE utf8_unicode_ci),'') ), '') , CASE WHEN S.IS_VISIBLE COLLATE utf8_unicode_ci = 'NO' THEN ' INVISIBLE '
ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC SEPARATOR "," ) INDEX_COLS, S.INDEX_TYPE
FROM INFORMATION_SCHEMA.STATISTICS S
INNER JOIN INFORMATION_SCHEMA.TABLES T ON S.TABLE_NAME = T.TABLE_NAME AND T.TABLE_SCHEMA
= @SOURCEDBNAME
LEFT OUTER JOIN INFORMATION_SCHEMA.STATISTICS D ON D.TABLE_SCHEMA = @SOURCEDBNAME AND
S.TABLE_NAME = D.TABLE_NAME AND S.INDEX_NAME = D.INDEX_NAME
WHERE S.TABLE_SCHEMA = @DESTINATIONDBNAME
-- AND S.NON_UNIQUE = 1
AND D.INDEX_NAME IS NULL
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, S.INDEX_TYPE;
-- Gets the Indexes, which are not associated with constraints, exist only in source
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, 'Index', CONCAT('Index exists only in source database
`', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, GROUP_CONCAT( "`", COALESCE(S.COLUMN_NAME COLLATE
utf8_unicode_ci ,S.EXPRESSION COLLATE utf8_unicode_ci ), "`", CASE WHEN S.COLLATION COLLATE
utf8_unicode_ci = 'D' THEN ' DESC ' ELSE '' END, COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT
COLLATE utf8_unicode_ci),'') ), '') , CASE WHEN S.IS_VISIBLE COLLATE utf8_unicode_ci = 'NO' THEN ' INVISIBLE '
ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC SEPARATOR "," ) INDEX_COLS, S.INDEX_TYPE
FROM INFORMATION_SCHEMA.STATISTICS S
INNER JOIN INFORMATION_SCHEMA.TABLES T ON S.TABLE_NAME = T.TABLE_NAME AND T.TABLE_SCHEMA
= @DESTINATIONDBNAME
LEFT OUTER JOIN INFORMATION_SCHEMA.STATISTICS D ON D.TABLE_SCHEMA = @DESTINATIONDBNAME
AND S.TABLE_NAME = D.TABLE_NAME AND S.INDEX_NAME = D.INDEX_NAME
WHERE S.TABLE_SCHEMA = @SOURCEDBNAME
-- AND S.NON_UNIQUE = 1
AND D.INDEX_NAME IS NULL
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, S.INDEX_TYPE;
-- Gets the Indexes, which are not associated with constraints, exist in both databases but with difference in its properties
INSERT INTO DB_COMPARE
SELECT S.*
FROM (
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, 'Index', CONCAT('Index with change in properties `',
S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 0
, GROUP_CONCAT( "`", COALESCE(S.COLUMN_NAME COLLATE utf8_unicode_ci ,S.EXPRESSION COLLATE
utf8_unicode_ci ), "`", CASE WHEN S.COLLATION COLLATE utf8_unicode_ci = 'D' THEN ' DESC ' ELSE '' END,
COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT COLLATE utf8_unicode_ci),'') ), '') , CASE WHEN
S.IS_VISIBLE COLLATE utf8_unicode_ci = 'NO' THEN ' INVISIBLE ' ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC
SEPARATOR "," ) INDEX_COLS, S.INDEX_TYPE
FROM INFORMATION_SCHEMA.STATISTICS S
WHERE S.TABLE_SCHEMA = @SOURCEDBNAME
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, S.INDEX_TYPE
)S
INNER JOIN
(
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME
,GROUP_CONCAT( "`", COALESCE(S.COLUMN_NAME COLLATE utf8_unicode_ci ,S.EXPRESSION COLLATE
utf8_unicode_ci ), "`", CASE WHEN S.COLLATION COLLATE utf8_unicode_ci = 'D' THEN ' DESC ' ELSE '' END,
COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT COLLATE utf8_unicode_ci),'') ), '') , CASE WHEN
S.IS_VISIBLE COLLATE utf8_unicode_ci = 'NO' THEN ' INVISIBLE ' ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC
SEPARATOR "," ) INDEX_COLS
FROM INFORMATION_SCHEMA.STATISTICS S
WHERE S.TABLE_SCHEMA = @DESTINATIONDBNAME
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME
) D ON S.TABLE_NAME = D.TABLE_NAME
AND S.INDEX_NAME = D.INDEX_NAME
AND S.INDEX_COLS <> D.INDEX_COLS;
CONCAT(' CREATE TABLE IF NOT EXISTS `', @DESTINATIONDBNAME , '`.`',S.TABLE_NAME, '` (',
GROUP_CONCAT( '`', COLUMN_NAME, '` ', COLUMN_TYPE
,CASE WHEN COLLATION_NAME IS NOT NULL THEN CONCAT(' COLLATE ', COLLATION_NAME , ' ') ELSE ' '
END
,CASE WHEN GENERATION_EXPRESSION IS NULL OR LENGTH(TRIM(GENERATION_EXPRESSION)) = 0 THEN
CONCAT( CASE WHEN IS_NULLABLE COLLATE utf8_unicode_ci = 'YES' THEN CONCAT(' NULL', ' DEFAULT ',
COALESCE(COLUMN_DEFAULT, 'NULL')) ELSE CONCAT(' NOT NULL', COALESCE(CONCAT(' DEFAULT ', CASE
WHEN TRIM(COLUMN_DEFAULT) = '' THEN "''" ELSE CASE WHEN SUBSTRING(TRIM(COLUMN_DEFAULT),1,1) =
'(' THEN COLUMN_DEFAULT ELSE CONCAT("'",COLUMN_DEFAULT,"'") END END), '') )END, ' ',
UPPER(LTRIM(COALESCE(REPLACE(EXTRA, 'DEFAULT_GENERATED', ''), ''))) )
ELSE
CONCAT(' GENERATED ALWAYS AS (', GENERATION_EXPRESSION, ') ', CASE EXTRA COLLATE utf8_unicode_ci
WHEN 'STORED GENERATED' THEN ' STORED ' WHEN 'VIRTUAL GENERATED' THEN ' VIRTUAL ' ELSE '' END)
END
ORDER BY C.ORDINAL_POSITION, '
' SEPARATOR ","), COALESCE(CONCAT(', ', MAX(I.INDEX_DEF)),''), COALESCE(CONCAT(', ',
MAX(CHK.CHECK_DEF)), ''), COALESCE(CONCAT(', ', MAX(FKEY.FKEY_DEF)), '') ,') ENGINE=InnoDB DEFAULT
CHARSET=utf8 COLLATE=utf8_unicode_ci;
') TABLE_DEFINITION
FROM DB_COMPARE S
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON S.DATABASE_NAME = C.TABLE_SCHEMA AND
S.TABLE_NAME = C.TABLE_NAME AND S.OBJECT_NAME IS NULL
LEFT OUTER JOIN
(
SELECT I.DATABASE_NAME TABLE_SCHEMA
,I.TABLE_NAME
,GROUP_CONCAT(CASE CONSTRAINT_TYPE WHEN 'PRIMARY KEY' THEN 'PRIMARY' WHEN 'UNIQUE' THEN
'UNIQUE' ELSE '' END, CASE WHEN INDEX_TYPE = 'BTREE' THEN ' KEY' ELSE CONCAT(' ', INDEX_TYPE, ' KEY ')
END, '`', OBJECT_NAME, '` (', INDEX_COLS, ' )' SEPARATOR "," ) INDEX_DEF
FROM DB_COMPARE I
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON TC.TABLE_SCHEMA = I.DATABASE_NAME
AND TC.TABLE_NAME = I.TABLE_NAME AND TC.CONSTRAINT_NAME = I.OBJECT_NAME
AND CONSTRAINT_TYPE NOT IN ('CHECK','FOREIGN KEY')
WHERE I.OBJECT_TYPE = 'Table' AND I.DATABASE_NAME = @SOURCEDBNAME AND I.ISMISSING = 1 AND
I.OBJECT_NAME IS NOT NULL
GROUP BY I.DATABASE_NAME, I.TABLE_NAME
)I ON I.TABLE_SCHEMA = S.DATABASE_NAME AND I.TABLE_NAME = S.TABLE_NAME
LEFT OUTER JOIN
(
SELECT TABLE_SCHEMA
,TABLE_NAME
,GROUP_CONCAT(CHECK_DEF SEPARATOR ",") CHECK_DEF
FROM (
SELECT TC.TABLE_SCHEMA
,TC.TABLE_NAME
,GROUP_CONCAT(' CONSTRAINT `', TC.CONSTRAINT_NAME, '` CHECK (', CHK.CHECK_CLAUSE, ')' SEPARATOR
"," ) CHECK_DEF
FROM DB_COMPARE I
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON TC.TABLE_SCHEMA = I.DATABASE_NAME
AND TC.TABLE_NAME = I.TABLE_NAME AND CONSTRAINT_TYPE = 'CHECK'
INNER JOIN INFORMATION_SCHEMA.CHECK_CONSTRAINTS CHK ON TC.TABLE_SCHEMA =
CHK.CONSTRAINT_SCHEMA AND TC.CONSTRAINT_NAME = CHK.CONSTRAINT_NAME
WHERE OBJECT_TYPE = 'Table' AND I.DATABASE_NAME = @SOURCEDBNAME AND I.ISMISSING = 1 AND
I.OBJECT_NAME IS NULL
GROUP BY TC.TABLE_SCHEMA, TC.TABLE_NAME
)CHK
GROUP BY TABLE_SCHEMA ,TABLE_NAME
)CHK ON CHK.TABLE_SCHEMA = S.DATABASE_NAME AND CHK.TABLE_NAME = S.TABLE_NAME
UNION ALL
SELECT CONCAT(' DROP TABLE IF EXISTS `', @DESTINATIONDBNAME , '`.`', S.TABLE_NAME, '`;
')
FROM DB_COMPARE S
WHERE OBJECT_TYPE = 'Table' AND S.DATABASE_NAME = @DESTINATIONDBNAME AND S.ISMISSING = 1
UNION ALL
-- Generate script for missing columns, index and other constraints in Source
SELECT
UNION ALL
-- Scripts to alter the existing column, index or constraints
SELECT
UNION ALL
-- Drop the index, connstraints and columnns which are existing onny in destination
SELECT
DELIMITER ;
-- Gets the columns, which are not part of any missing table, exist in source
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.COLUMN_NAME, 'Column', CONCAT('Column exists only in source
database `', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, NULL, NULL
FROM `tables_backup`.INFORMATION_SCHEMA_COLUMNS S
INNER JOIN `tables_backup`.information_schema_tables T ON S.TABLE_NAME = T.TABLE_NAME AND
T.TABLE_SCHEMA = @DESTINATIONDBNAME
LEFT OUTER JOIN `tables_backup`.INFORMATION_SCHEMA_COLUMNS D ON D.TABLE_SCHEMA =
@DESTINATIONDBNAME AND S.TABLE_NAME = D.TABLE_NAME AND S.COLUMN_NAME = D.COLUMN_NAME
WHERE S.TABLE_SCHEMA = @SOURCEDBNAME
AND D.COLUMN_NAME IS NULL;
-- Gets the columns, which are not part of any missing table, exist in destination
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.COLUMN_NAME, 'Column', CONCAT('Column exists only in
destination database `', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, NULL, NULL
FROM `tables_backup`.INFORMATION_SCHEMA_COLUMNS S
INNER JOIN `tables_backup`.information_schema_tables T ON S.TABLE_NAME = T.TABLE_NAME AND
T.TABLE_SCHEMA = @SOURCEDBNAME
LEFT OUTER JOIN `tables_backup`.INFORMATION_SCHEMA_COLUMNS D ON D.TABLE_SCHEMA =
@SOURCEDBNAME AND S.TABLE_NAME = D.TABLE_NAME AND S.COLUMN_NAME = D.COLUMN_NAME
WHERE S.TABLE_SCHEMA = @DESTINATIONDBNAME
AND D.COLUMN_NAME IS NULL;
);
-- AND SHA2(CONCAT(S.COLUMN_DEFAULT, description), 256) = SHA2(CONCAT(name, description), 256);
-- Gets the Indexes, which are not associated with constraints, exist only in destination
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, 'Index', CONCAT('Inded exists only in destination
database `', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, GROUP_CONCAT( "`",
COALESCE(S.COLUMN_NAME ,S.EXPRESSION ), "`", CASE WHEN S.COLLATION = 'D' THEN ' DESC ' ELSE '' END,
COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT),'') ), '') , CASE WHEN S.IS_VISIBLE = 'NO' THEN '
INVISIBLE ' ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC SEPARATOR "," ) INDEX_COLS, S.INDEX_TYPE
FROM `tables_backup`.INFORMATION_SCHEMA_STATISTICS S
INNER JOIN `tables_backup`.information_schema_tables T ON S.TABLE_NAME = T.TABLE_NAME AND
T.TABLE_SCHEMA = @SOURCEDBNAME
LEFT OUTER JOIN `tables_backup`.INFORMATION_SCHEMA_STATISTICS D ON D.TABLE_SCHEMA =
@SOURCEDBNAME AND S.TABLE_NAME = D.TABLE_NAME AND S.INDEX_NAME = D.INDEX_NAME
WHERE S.TABLE_SCHEMA = @DESTINATIONDBNAME
-- AND S.NON_UNIQUE = 1
AND D.INDEX_NAME IS NULL
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, S.INDEX_TYPE;
-- Gets the Indexes, which are not associated with constraints, exist only in source
INSERT INTO DB_COMPARE
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, 'Index', CONCAT('Inded exists only in source database
`', S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 1, GROUP_CONCAT( "`",
COALESCE(S.COLUMN_NAME ,S.EXPRESSION ), "`", CASE WHEN S.COLLATION = 'D' THEN ' DESC ' ELSE '' END,
COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT),'') ), '') , CASE WHEN S.IS_VISIBLE = 'NO' THEN '
INVISIBLE ' ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC SEPARATOR "," ) INDEX_COLS, S.INDEX_TYPE
FROM `tables_backup`.INFORMATION_SCHEMA_STATISTICS S
INNER JOIN `tables_backup`.information_schema_tables T ON S.TABLE_NAME = T.TABLE_NAME AND
T.TABLE_SCHEMA = @DESTINATIONDBNAME
LEFT OUTER JOIN `tables_backup`.INFORMATION_SCHEMA_STATISTICS D ON D.TABLE_SCHEMA =
@DESTINATIONDBNAME AND S.TABLE_NAME = D.TABLE_NAME AND S.INDEX_NAME = D.INDEX_NAME
WHERE S.TABLE_SCHEMA = @SOURCEDBNAME
-- AND S.NON_UNIQUE = 1
AND D.INDEX_NAME IS NULL
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, S.INDEX_TYPE;
-- Gets the Indexes, which are not associated with constraints, exist in both databases but with difference in its properties
INSERT INTO DB_COMPARE
SELECT S.*
FROM (
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, 'Index', CONCAT('Index with change in properties `',
S.TABLE_SCHEMA, '`.`', S.TABLE_NAME, '`'), 0
, GROUP_CONCAT( "`", COALESCE(S.COLUMN_NAME ,S.EXPRESSION ), "`", CASE WHEN S.COLLATION = 'D'
THEN ' DESC ' ELSE '' END, COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT),'') ), '') , CASE WHEN
S.IS_VISIBLE = 'NO' THEN ' INVISIBLE ' ELSE '' END ORDER BY S.SEQ_IN_INDEX ASC SEPARATOR "," )
INDEX_COLS, S.INDEX_TYPE
FROM `tables_backup`.INFORMATION_SCHEMA_STATISTICS S
WHERE S.TABLE_SCHEMA = @SOURCEDBNAME
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME, S.INDEX_TYPE
)S
INNER JOIN
(
SELECT S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME
,GROUP_CONCAT( "`", COALESCE(S.COLUMN_NAME ,S.EXPRESSION ), "`", CASE WHEN S.COLLATION = 'D'
THEN ' DESC ' ELSE '' END, COALESCE(CONCAT(' COMMENT', NULLIF(TRIM(S.COMMENT COLLATE
utf8_unicode_ci),'') ), '') , CASE WHEN S.IS_VISIBLE = 'NO' THEN ' INVISIBLE ' ELSE '' END ORDER BY
S.SEQ_IN_INDEX ASC SEPARATOR "," ) INDEX_COLS
FROM `tables_backup`.INFORMATION_SCHEMA_STATISTICS S
WHERE S.TABLE_SCHEMA = @DESTINATIONDBNAME
GROUP BY S.TABLE_SCHEMA, S.TABLE_NAME, S.INDEX_NAME
) D ON S.TABLE_NAME = D.TABLE_NAME
AND S.INDEX_NAME = D.INDEX_NAME
AND S.INDEX_COLS <> D.INDEX_COLS;
CONCAT(' CREATE TABLE IF NOT EXISTS `', @DESTINATIONDBNAME , '`.`',S.TABLE_NAME, '` (',
GROUP_CONCAT( '`', COLUMN_NAME, '` ', COLUMN_TYPE
,CASE WHEN COLLATION_NAME IS NOT NULL THEN CONCAT(' COLLATE ', COLLATION_NAME , ' ') ELSE ' '
END
,CASE WHEN GENERATION_EXPRESSION IS NULL OR LENGTH(TRIM(GENERATION_EXPRESSION)) = 0 THEN
CONCAT( CASE WHEN IS_NULLABLE = 'YES' THEN CONCAT(' NULL', ' DEFAULT ',
COALESCE(COLUMN_DEFAULT, 'NULL')) ELSE CONCAT(' NOT NULL', COALESCE(CONCAT(' DEFAULT ', CASE
WHEN TRIM(COLUMN_DEFAULT) = '' THEN "''" ELSE CASE WHEN SUBSTRING(TRIM(COLUMN_DEFAULT),1,1) =
'(' THEN COLUMN_DEFAULT ELSE CONCAT("'",COLUMN_DEFAULT,"'") END END), '') )END, ' ',
UPPER(LTRIM(COALESCE(REPLACE(EXTRA, 'DEFAULT_GENERATED', ''), ''))) )
ELSE
CONCAT(' GENERATED ALWAYS AS (', GENERATION_EXPRESSION, ') ', CASE EXTRA WHEN 'STORED
GENERATED' THEN ' STORED ' WHEN 'VIRTUAL GENERATED' THEN ' VIRTUAL ' ELSE '' END)
END
ORDER BY C.ORDINAL_POSITION, '
' SEPARATOR ","), COALESCE(CONCAT(', ', MAX(I.INDEX_DEF)),''), COALESCE(CONCAT(', ',
MAX(CHK.CHECK_DEF)), ''), COALESCE(CONCAT(', ', MAX(FKEY.FKEY_DEF)), '') ,') ENGINE=InnoDB DEFAULT
CHARSET=utf8 COLLATE=utf8_unicode_ci;
') TABLE_DEFINITION
FROM DB_COMPARE S
INNER JOIN `tables_backup`.INFORMATION_SCHEMA_COLUMNS C ON S.DATABASE_NAME = C.TABLE_SCHEMA
AND S.TABLE_NAME = C.TABLE_NAME AND S.OBJECT_NAME IS NULL
LEFT OUTER JOIN
(
SELECT I.DATABASE_NAME TABLE_SCHEMA
,I.TABLE_NAME
,GROUP_CONCAT(CASE CONSTRAINT_TYPE WHEN 'PRIMARY KEY' THEN 'PRIMARY' WHEN 'UNIQUE' THEN
'UNIQUE' ELSE '' END, CASE WHEN INDEX_TYPE = 'BTREE' THEN ' KEY' ELSE CONCAT(' ', INDEX_TYPE, ' KEY ')
END, '`', OBJECT_NAME, '` (', INDEX_COLS, ' )' SEPARATOR "," ) INDEX_DEF
FROM DB_COMPARE I
LEFT JOIN `tables_backup`.INFORMATION_SCHEMA_TABLE_CONSTRAINTS TC ON TC.TABLE_SCHEMA =
I.DATABASE_NAME AND TC.TABLE_NAME = I.TABLE_NAME AND TC.CONSTRAINT_NAME = I.OBJECT_NAME
AND CONSTRAINT_TYPE NOT IN ('CHECK','FOREIGN KEY')
WHERE I.OBJECT_TYPE = 'Table' AND I.DATABASE_NAME = @SOURCEDBNAME AND I.ISMISSING = 1 AND
I.OBJECT_NAME IS NOT NULL
GROUP BY I.DATABASE_NAME, I.TABLE_NAME
)I ON I.TABLE_SCHEMA = S.DATABASE_NAME AND I.TABLE_NAME = S.TABLE_NAME
LEFT OUTER JOIN
(
SELECT TABLE_SCHEMA
,TABLE_NAME
,GROUP_CONCAT(CHECK_DEF SEPARATOR ",") CHECK_DEF
FROM (
SELECT TC.TABLE_SCHEMA
,TC.TABLE_NAME
,GROUP_CONCAT(' CONSTRAINT `', TC.CONSTRAINT_NAME, '` CHECK (', CHK.CHECK_CLAUSE, ')' SEPARATOR
"," ) CHECK_DEF
FROM DB_COMPARE I
INNER JOIN `tables_backup`.INFORMATION_SCHEMA_TABLE_CONSTRAINTS TC ON TC.TABLE_SCHEMA =
I.DATABASE_NAME AND TC.TABLE_NAME = I.TABLE_NAME AND CONSTRAINT_TYPE = 'CHECK'
INNER JOIN `tables_backup`.INFORMATION_SCHEMA_CHECK_CONSTRAINTS CHK ON TC.TABLE_SCHEMA =
CHK.CONSTRAINT_SCHEMA AND TC.CONSTRAINT_NAME = CHK.CONSTRAINT_NAME
WHERE OBJECT_TYPE = 'Table' AND I.DATABASE_NAME = @SOURCEDBNAME AND I.ISMISSING = 1 AND
I.OBJECT_NAME IS NULL
GROUP BY TC.TABLE_SCHEMA, TC.TABLE_NAME
)CHK
GROUP BY TABLE_SCHEMA ,TABLE_NAME
)CHK ON CHK.TABLE_SCHEMA = S.DATABASE_NAME AND CHK.TABLE_NAME = S.TABLE_NAME
UNION ALL
SELECT CONCAT(' DROP TABLE IF EXISTS `', @DESTINATIONDBNAME , '`.`', S.TABLE_NAME, '`;
')
FROM DB_COMPARE S
WHERE OBJECT_TYPE = 'Table' AND S.DATABASE_NAME = @DESTINATIONDBNAME AND S.ISMISSING = 1
UNION ALL
-- Generate script for missing columns, index and other constraints in Source
SELECT
UNION ALL
UNION ALL
-- Drop the index, connstraints and columnns which are existing onny in destination
SELECT
END //
DELIMITER ;
ELSE
CREATE TABLE `tables_backup`.`information_schema_tables` AS SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @SOURCEDBNAME;
ALTER TABLE `tables_backup`.`information_schema_tables` ADD KEY `ix_tables` (TABLE_SCHEMA,
TABLE_NAME);
END IF;
END IF;
END //
DELIMITER ;
DROP PROCEDURE IF EXISTS SP_DBSCHEMACOMPARE_INSERT_SYSTEM_DATA;
DELIMITER //
CREATE PROCEDURE SP_DBSCHEMACOMPARE_INSERT_SYSTEM_DATA (SOURCEDBNAME VARCHAR(64))
BEGIN
END //
DELIMITER ;
import string
import mysql.connector
from mysql.connector import errorcode
class createConnection:
hostName = ""
DBName = ""
portNumber = ""
userName = ""
password = ""
self.userName = userName
self.password = password
DB SCHEMACOMPARE.PY
import createConnection
import getpass
import os
class DBSchemaCompare:
ConfigFileDict = dict()
'''
def __init__(self, configFilePath):
if len(configFilePath.strip("")) == 0:
print("DB Schema comparison failed as config file does not exist")
exit()
else:
self.configFilePath = configFilePath
def readConfigFile(self):
with open(self.configFilePath) as configFileHandler:
for lines in configFileHandler:
if len(lines.strip().split(":")) == 2:
if len(lines.strip().split(":")[0]) > 0:
self.configValues[lines.strip().split(":")[0]] = lines.strip().split(":")[1]
return self.configValues
'''
def DBSchemaCompare(self):
ConfigFileDict = self.ConfigFileDict
if "IsDBSchemaCompare" in ConfigFileDict:
if int(ConfigFileDict.get("IsDBSchemaCompare")) == 1:
try:
if "source_HostName" in ConfigFileDict:
sourceHostPassword = getpass.getpass(f'Enter the password for the host {ConfigFileDict["source_HostName"]}:
')
if "destination_HostName" in ConfigFileDict:
destHostPassword = getpass.getpass(f'Enter the password for the host
{ConfigFileDict["destination_HostName"]}: ')
SourceDBConnection = createConnection.createConnection(ConfigFileDict["source_HostName"],
ConfigFileDict["source_DBName"],
ConfigFileDict["sourcePortNumber"],
ConfigFileDict["sourceUserName"],
sourceHostPassword)
SourceDBConnectionInstance = SourceDBConnection.createDBConnection()
if SourceDBConnectionInstance.is_connected():
cursor = SourceDBConnectionInstance.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS tables_backup CHARACTER SET utf8 COLLATE
utf8_tolower_ci; ")
cursor.close()
SourceDBConnectionInstance.close()
DestinationDBConnection = createConnection.createConnection(ConfigFileDict["destination_HostName"],
ConfigFileDict["destination_DBName"],
ConfigFileDict["destinationPortNumber"],
ConfigFileDict["destinationUserName"],
destHostPassword)
DestinationDBConnectionInstance = DestinationDBConnection.createDBConnection()
if DestinationDBConnectionInstance.is_connected():
cursor = DestinationDBConnectionInstance.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS tables_backup CHARACTER SET utf8 COLLATE
utf8_tolower_ci; ")
cursor.close()
DestinationDBConnectionInstance.close()
if ConfigFileDict["source_HostName"] == ConfigFileDict["destination_HostName"]:
os_command = f'mysql -h{ConfigFileDict["source_HostName"]} -u{ConfigFileDict["sourceUserName"]} -
p{sourceHostPassword} tables_backup < ./Schema_Compare.sql'
command_output = os.system(os_command)
else:
os_command = f'cat ./Schema_Compare.sql | mysql -h{ConfigFileDict["source_HostName"]} tables_backup -
u{ConfigFileDict["sourceUserName"]} -p{sourceHostPassword} '
command_output = os.system(os_command)
DestinationDBConnection = createConnection.createConnection(
ConfigFileDict["destination_HostName"],
"tables_backup",
ConfigFileDict["destinationPortNumber"],
ConfigFileDict["destinationUserName"],
destHostPassword)
DestinationDBConnectionInstance = DestinationDBConnection.createDBConnection()
if DestinationDBConnectionInstance.is_connected():
cursor = DestinationDBConnectionInstance.cursor()
strSQL = "call tables_backup.SP_DBSCHEMACOMPARE_COPY_SYSTEM_DATA('" +
ConfigFileDict["destination_DBName"] + "'); "
cursor.execute(strSQL)
DestinationDBConnectionInstance.commit()
cursor.close()
DestinationDBConnectionInstance.close()
SourceDBConnection = createConnection.createConnection(
ConfigFileDict["source_HostName"],
"tables_backup",
ConfigFileDict["sourcePortNumber"],
ConfigFileDict["sourceUserName"],
sourceHostPassword)
SourceDBConnectionInstance = SourceDBConnection.createDBConnection()
if SourceDBConnectionInstance.is_connected():
cursor_source = SourceDBConnectionInstance.cursor()
strSQL = "call tables_backup.SP_DBSCHEMACOMPARE_COPY_SYSTEM_DATA('" +
ConfigFileDict["source_DBName"] + "'); "
cursor_source.execute(strSQL)
SourceDBConnectionInstance.commit()
cursor_source.close()
SourceDBConnectionInstance.close()
print("check now")
if not os.path.isfile("Schema_Compare_Result_CrossRegion.sql") :
print("MySQL dump file does not exist")
exit()
MAIN.PY
import createConnection
import DBSchemaCompare
import os
import csv
configFilePath = f"./DBConfig.cnf"
ConfigFileDict = dict()
sourceHostPassword = ""
destHostPassword = ""
# DBConnectionInstance.createDBConnection()
HARDWARE:-
SOFTWARE:-
Windows 7 or higher
My-SQL server 5.5 or higher (as backend)
Python idle 3.8 or higher or spyder (as frontend).
Microsoft Word 2010 or higher for documentation.
BIBILIOGRAPHY