diff --git a/my_flask_app/__pycache__/main.cpython-39.pyc b/my_flask_app/__pycache__/main.cpython-39.pyc
index 7f1701b3638f7875b2bf7d8f5cf3b86b29fd50f6..7cff0738314b51c610d7db7ec14f520833d49a47 100644
Binary files a/my_flask_app/__pycache__/main.cpython-39.pyc and b/my_flask_app/__pycache__/main.cpython-39.pyc differ
diff --git a/my_flask_app/main.py b/my_flask_app/main.py
index 144e885d8d085fb1b8a0c38ed7e33047929de294..88190b45779015a0130f251cfd635ea3758a2cb1 100644
--- a/my_flask_app/main.py
+++ b/my_flask_app/main.py
@@ -1,50 +1,68 @@
 from my_flask_app import app
-from .models.models import Table, Column, Theme
+from .models.models import CustomTable, CustomColumn, Theme
 from flask_sqlalchemy import SQLAlchemy
-from flask import jsonify, render_template, request, session, send_file
-from sqlalchemy import text
-import re, pydot, base64
-import pydot
+from flask import jsonify, redirect, render_template, request, url_for, session
+from sqlalchemy import Inspector, MetaData, create_engine, text, inspect
+import pydot, base64, os
+from sqlalchemy.orm import scoped_session, sessionmaker
 
 
-# Set up database
+# Set up database (call db.engine)
 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
-app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:password@localhost:5432/test"
+# app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:password@localhost:5432/test"
  
 db = SQLAlchemy() 
-db.init_app(app)
+# db.init_app(app)
 
 app.secret_key = 'my_secret_key'  # Needed for session management
 dropped_items = []
 
 @app.route('/', methods=['POST', 'GET'])
 def index():
-    # Initialize variables
-    database = db.engine.url.database
-    tables_selected = []
-    # tables_selected = ['machine_sensor', 'machine_tool', 'machine_trace']
-    schemas = getSchema()
-    themes = getThemes()
+    if request.method == 'POST':
+        # Handle the form submission
+        database_uri = request.form['database_uri']
+        session['db_uri'] = database_uri
+        engine = create_engine(database_uri)
+        session_factory = sessionmaker(bind=engine)
+        db.session = scoped_session(session_factory)
+        insp = inspect(engine)
+        metadata_obj = MetaData()
+
+        # Determine the type and naem of database 
+        database_type = engine.dialect.name                     # postgresql, sqlite
+        database = database_name_from_uri(engine, database_uri)
+        # Initialize variables
+        tables_selected = []
+        schemas = getSchema(insp)
+        themes = getThemes()
+
+        schema_Selected = request.form.get('schema', None)
+        show_all = request.form.get('show_all') == 'True'
+
+        tables1 = importMetadata(engine, schema_Selected, tables_selected, show_all)
+        # graph_DOT1 = createGraph(tables1, themes["Blue Navy"], True, True, True)
+        # image1 = generate_erd(graph_DOT1)
+
+        if dropped_items==[]:
+            image2 = ""
+        # else:
+        #     tables2 = importMetadata(engine, None, dropped_items, False)
+        #     graph_DOT2 = createGraph(tables2, themes["Blue Navy"], True, True, True)
+        #     image2 = generate_erd(graph_DOT2)
+
+        # return render_template('app.html', database=database, schemas=schemas, show_all=show_all, schema_Selected=schema_Selected, tables=tables1, image1=image1, image2=image2, dropped_items=dropped_items)
+        
 
-    schema_Selected = request.form.get('schema', None)
-    show_all = request.form.get('show_all') == 'True'
 
-    tables1 = importMetadata(database, schema_Selected, tables_selected, show_all)
-    graph_DOT1 = createGraph(tables1, themes["Blue Navy"], True, True, True)
-    image1 = generate_erd(graph_DOT1)
+        # print(insp.get_foreign_keys('machine_sensor'))
+        # print(insp.get_unique_constraints('segmentation_data', schema='segmentation'))
 
-    if dropped_items==[]:
-        image2 = ""
+        return render_template('app.html', database=database, schemas=schemas, show_all=show_all, schema_Selected=schema_Selected, tables=tables1, dropped_items=dropped_items)
     else:
-        tables2 = importMetadata(database, None, dropped_items, False)
-        graph_DOT2 = createGraph(tables2, themes["Blue Navy"], True, True, True)
-        image2 = generate_erd(graph_DOT2)
-
-    print(getTableSchema('event_data'))
-     
-    return render_template('app.html', database=database, schemas=schemas, show_all=show_all, schema_Selected=schema_Selected, tables=tables1, image1=image1, image2=image2, dropped_items=dropped_items)
-
-
+        # Display the form
+        return render_template('app.html')
+    
 
 @app.route('/handle-drop', methods=['POST'])
 def handle_drop():
@@ -67,8 +85,6 @@ def handle_drop():
     return jsonify(image2=image2)
 
 
-
-
 @app.route('/get-table-data', methods=['POST'])
 def get_table_data():
     data = request.json
@@ -83,6 +99,15 @@ def get_table_data():
 
     return jsonify({'html_table': html_table})
 
+
+def database_name_from_uri(engine, database_uri: str):
+    if engine.dialect.name == 'postgresql':
+        return engine.url.database
+    elif engine.dialect.name == 'sqlite':
+        return os.path.splitext(os.path.basename(database_uri.split('///')[-1]))[0]
+    else:
+        return 'Unknown'
+    
 def generate_html_table(content):
     if not content:
         return "No data found."
@@ -104,7 +129,6 @@ def generate_html_table(content):
     return table_html
 
 
-
 def query_database_for_table_content(table_name, number=20):
     # Initialize content list
     content_list = []
@@ -136,6 +160,7 @@ def query_database_for_table_content(table_name, number=20):
 
     return content_list
 
+# Only postgresql needs this function (database_type = 'postgresql')
 def getTableSchema(table_name):
     sql= text(f"""
         SELECT table_schema 
@@ -144,214 +169,256 @@ def getTableSchema(table_name):
     """)
     schema = db.session.execute(sql, {'table_name': table_name}).fetchone()[0]
     return schema
+    
 
-
-
-def getSchema():
-    sql = text("""SELECT schema_name FROM information_schema.schemata;""")
-    result = db.session.execute(sql)
-    schemas = [row[0] for row in result]
+def getSchema(insp):
+    # sql = text("""SELECT schema_name FROM information_schema.schemata;""")
+    # result = db.session.execute(sql)
+    # schemas = [row[0] for row in result]
+    schemas = insp.get_schema_names()
     return schemas
 
 
-def importMetadata(database, schema=None, tables_selected=None, show_all=False):
+def importMetadata(engine, schema=None, tables_selected=None, show_all=False):
     tables = {}
-    if database == '':
+    if engine == None:
         return tables
 
     # Convert tables_selected to a list to ensure compatibility with SQL IN operation.
     tables_selected_list = list(tables_selected) if tables_selected else None
 
     # Fetch initial tables based on schema and table_names.
-    tables = fetch_initial_tables(schema, tables_selected_list)
+    tables = fetch_initial_tables(engine, schema, tables_selected_list)
 
     # If show_all is True, expand the list to include related tables.
     if show_all:
-        expand_to_include_related_tables(tables)
+        expand_to_include_related_tables(engine, tables)
 
     # Fetch columns for each table.
-    fetch_columns_for_tables(tables)
+    fetch_columns_for_tables(engine, tables)
 
     # Fetch constraints (PK, FK, Unique) for each table.
-    fetch_constraints_for_tables(tables)
+    fetch_constraints_for_tables(engine, tables)
 
     return tables
 
 
-def fetch_initial_tables(schema, tables_selected_list):
+def fetch_initial_tables(engine, schema=None, tables_selected_list=None):
+    if isinstance(engine, str):
+        engine = create_engine(engine)
     tables = {}
-
-    # Construct WHERE clauses based on input parameters.
-    schema_condition = "AND table_schema = :schema" if schema else ""
-    tables_selected_condition = "AND table_name = ANY(:tables_selected)" if tables_selected_list else ""
-
-    # Fetching tables with dynamic schema and table name filtering.
-    sql_tables = text(f"""
-        SELECT table_name, table_schema
-        FROM information_schema.tables
-        WHERE table_type = 'BASE TABLE'
-        {schema_condition} {tables_selected_condition};
-    """)
-    
-    # Adjust parameters based on the conditions.
-    params = {}
-    if schema:
-        params['schema'] = schema
+    insp = inspect(engine)
+    database_type = engine.dialect.name
+
+    # Get all table names in the database (or specific schema for PostgreSQL)
+    all_tables = []
+    if schema!=None and database_type == 'postgresql':
+        all_tables = insp.get_table_names(schema=schema)
+    elif schema==None and database_type == 'postgresql':
+        for schema_of_schemas in insp.get_schema_names():
+            for table_name in insp.get_table_names(schema=schema_of_schemas):
+                all_tables.append(table_name)
+    else:       # For SQLite
+        all_tables = insp.get_table_names() 
+
+    # Filter tables if a specific list is provided
     if tables_selected_list:
-        params['tables_selected'] = tables_selected_list
-
-    result = db.session.execute(sql_tables, params)
+        table_names = [table for table in all_tables if table in tables_selected_list]
+    else:
+        table_names = all_tables
 
-    for row in result:
-        tableName, tableSchema = row
-        table = Table(tableName, tableSchema)   # adding schema to the table comment
-        tables[tableName] = table
+    for table_name in table_names:
+        # For PostgreSQL, use the provided schema, otherwise use the default schema
+        table_schema = getTableSchema(table_name) if database_type == 'postgresql' else insp.default_schema_name
+        table = CustomTable(table_name, table_schema)
+        tables[table_name] = table
         table.label = f"n{len(tables)}"
 
     return tables
 
 
-def expand_to_include_related_tables(tables):
+def expand_to_include_related_tables(engine, tables):
+    if isinstance(engine, str):
+        engine = create_engine(engine)
+    # Create an inspector object
+    insp = inspect(engine)
+
     # This dictionary will temporarily store related tables to fetch later.
     related_tables_to_fetch = {}
 
     # Iterate over initially fetched tables to find foreign key relationships.
     for tableName, table in tables.items():
-        # Fetch foreign key relationships for the current table.
-        sql_fk = text("""
-            SELECT 
-                ccu.table_name AS pk_table_name, 
-                ccu.table_schema AS pk_table_schema
-            FROM 
-                information_schema.table_constraints AS tc 
-                JOIN information_schema.key_column_usage AS kcu 
-                ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema AND tc.table_name = kcu.table_name
-                JOIN information_schema.constraint_column_usage AS ccu 
-                ON ccu.constraint_name = tc.constraint_name
-            WHERE 
-                tc.constraint_type = 'FOREIGN KEY' 
-                AND tc.table_name = :table_name
-        """)
-        fk_result = db.session.execute(sql_fk, {'table_name': tableName})
+        # Fetch foreign key relationships for the current table using the inspector.
+        fks = insp.get_foreign_keys(tableName, schema=table.schema)
+        for fk in fks:
+            referenced_table_name = fk['referred_table']
+            referenced_schema = fk['referred_schema']
 
-        
-        for referenced_table_name, referenced_schema in fk_result:
             if referenced_table_name not in tables and referenced_table_name not in related_tables_to_fetch:
                 related_tables_to_fetch[referenced_table_name] = referenced_schema
 
     # Fetch and add related tables.
     for tableName, tableSchema in related_tables_to_fetch.items():
-        # Assuming a function fetch_table_details(tableName, tableSchema) that fetches and returns
-        # a Table object with columns and constraints populated.
-        table = Table(tableName, tableSchema)
+        # Create a CustomTable object for each related table.
+        table = CustomTable(tableName, tableSchema)
         tables[tableName] = table
 
     return tables
 
 
-def fetch_columns_for_tables(tables):
-    for tableName, table in tables.items():
-        sql_columns = text("""
-            SELECT column_name, data_type, is_nullable, column_default
-            FROM information_schema.columns
-            WHERE table_name = :table_name;
-        """)
-        column_result = db.session.execute(sql_columns, {'table_name': tableName})
+def fetch_columns_for_tables(engine, tables):
+    if isinstance(engine, str):
+        engine = create_engine(engine)
+    insp = inspect(engine)
 
-        for col in column_result:
-            name, datatype, nullable, default = col
-            column = Column(table, name, '')
+    for tableName, table in tables.items():
+        # Use the inspector to get column information for each table
+        columns = insp.get_columns(tableName, schema=table.schema)
+        for col in columns:
+            name = col['name']
+            datatype = col['type']
+            nullable = col['nullable']
+            default = col['default']
+
+            # Create a CustomColumn object with the retrieved information
+            column = CustomColumn(table, name, '')
             column.setDataType({
-                "type": datatype,
-                "nullable": nullable == 'YES',
+                "type": str(datatype),
+                "nullable": nullable,
                 "default": default
             })
+
+            # Append the column to the table's columns list
             table.columns.append(column)
-    return tables  
+    return tables
+
 
+def fetch_constraints_for_tables(engine, tables):
+    if isinstance(engine, str):
+        engine = create_engine(engine)
+    insp = inspect(engine)
 
-def fetch_constraints_for_tables(tables):
     # Fetching Unique Constraints
     for tableName, table in tables.items():
-        sql_unique = text("""
-            SELECT kcu.column_name, tc.constraint_name
-            FROM information_schema.table_constraints AS tc
-            JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
-            WHERE tc.table_name = :table_name AND tc.constraint_type = 'UNIQUE';
-        """)
-        unique_result = db.session.execute(sql_unique, {'table_name': tableName})
-        for col in unique_result:
-            name, constraintName = col
-            column = table.getColumn(name)
-            if column:
-                column.isunique = True
-                if constraintName not in table.uniques:
-                    table.uniques[constraintName] = []
-                table.uniques[constraintName].append(column)
-
+        unique_constraints = insp.get_unique_constraints(tableName, schema=table.schema)
+        for uc in unique_constraints:
+            for column_name in uc['column_names']:
+                column = table.getColumn(column_name)
+                if column:
+                    column.isunique = True
+                    if uc['name'] not in table.uniques:
+                        table.uniques[uc['name']] = []
+                    table.uniques[uc['name']].append(column)
 
     # Primary Keys
     for tableName, table in tables.items():
-        sql_pk = text("""
-            SELECT kcu.column_name, tc.constraint_name, kcu.ordinal_position
-            FROM information_schema.table_constraints AS tc
-            JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
-            WHERE tc.table_name = :table_name AND tc.constraint_type = 'PRIMARY KEY';
-        """)
-        pk_result = db.session.execute(sql_pk, {'table_name': tableName})
-        for col in pk_result:
-            name, constraintName, ordinal_position = col
-            column = table.getColumn(name)
+        pk_constraint = insp.get_pk_constraint(tableName, schema=table.schema)
+        for column_name in pk_constraint['constrained_columns']:
+            column = table.getColumn(column_name)
             if column:
                 column.ispk = True
-                column.pkconstraint = constraintName
-                # Assuming you want to order PKs, though not directly used in provided class
+                column.pkconstraint = pk_constraint['name']
 
-
-    # Fetching Foreign Keys for each table
+    # Foreign Keys
     for tableName, table in tables.items():
-        sql_fk = text("""
-            SELECT 
-                tc.constraint_name, 
-                tc.table_name AS fk_table_name, 
-                kcu.column_name AS fk_column_name, 
-                ccu.table_name AS pk_table_name, 
-                ccu.column_name AS pk_column_name,
-                ccu.table_schema AS pk_table_schema
-            FROM 
-                information_schema.table_constraints AS tc 
-                JOIN information_schema.key_column_usage AS kcu 
-                ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema AND tc.table_name = kcu.table_name
-                JOIN information_schema.constraint_column_usage AS ccu 
-                ON ccu.constraint_name = tc.constraint_name
-            WHERE 
-                tc.constraint_type = 'FOREIGN KEY' 
-                AND tc.table_name = :table_name
-        """)
-
-        fk_result = db.session.execute(sql_fk, {'table_name': tableName})
-        for row in fk_result:
-            constraintName, fkTableName, fkColumnName, pkTableName, pkColumnName, pkTableSchema = row
+        fks = insp.get_foreign_keys(tableName, schema=table.schema)
+        for fk in fks:
+            fk_columns = fk['constrained_columns']
+            referred_table = fk['referred_table']
+            referred_columns = fk['referred_columns']
+            for fk_column, ref_column in zip(fk_columns, referred_columns):
+                column = table.getColumn(fk_column)
+                if column:
+                    column.fkof = f"{referred_table}.{ref_column}"
+                    if fk['name'] not in table.fks:
+                        table.fks[fk['name']] = []
+                    table.fks[fk['name']].append(column)
 
-            # Ensure the foreign key table is the current table being processed
-            if fkTableName != tableName:
-                continue
-
-
-            fkTable = tables.get(fkTableName)
-            pkTable = tables.get(pkTableName)
+    return tables
 
-            if fkTable and pkTable:
-                fkColumn = fkTable.getColumn(fkColumnName)
-                pkColumn = pkTable.getColumn(pkColumnName)
 
-                if fkColumn and pkColumn:
-                    # Here, instead of assigning pkColumn directly, store relevant info
-                    fkColumn.fkof = pkColumn  # Adjust based on your application's needs
-                    if constraintName not in fkTable.fks:
-                        fkTable.fks[constraintName] = []
-                    fkTable.fks[constraintName].append(fkColumn)
-    return tables
+# def fetch_constraints_for_tables(engine, tables):
+#     # Fetching Unique Constraints
+#     for tableName, table in tables.items():
+#         sql_unique = text("""
+#             SELECT kcu.column_name, tc.constraint_name
+#             FROM information_schema.table_constraints AS tc
+#             JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
+#             WHERE tc.table_name = :table_name AND tc.constraint_type = 'UNIQUE';
+#         """)
+#         unique_result = db.session.execute(sql_unique, {'table_name': tableName})
+#         for col in unique_result:
+#             name, constraintName = col
+#             column = table.getColumn(name)
+#             if column:
+#                 column.isunique = True
+#                 if constraintName not in table.uniques:
+#                     table.uniques[constraintName] = []
+#                 table.uniques[constraintName].append(column)
+
+
+#     # Primary Keys
+#     for tableName, table in tables.items():
+#         sql_pk = text("""
+#             SELECT kcu.column_name, tc.constraint_name, kcu.ordinal_position
+#             FROM information_schema.table_constraints AS tc
+#             JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
+#             WHERE tc.table_name = :table_name AND tc.constraint_type = 'PRIMARY KEY';
+#         """)
+#         pk_result = db.session.execute(sql_pk, {'table_name': tableName})
+#         for col in pk_result:
+#             name, constraintName, ordinal_position = col
+#             column = table.getColumn(name)
+#             if column:
+#                 column.ispk = True
+#                 column.pkconstraint = constraintName
+#                 # Assuming you want to order PKs, though not directly used in provided class
+
+
+#     # Fetching Foreign Keys for each table
+#     for tableName, table in tables.items():
+#         sql_fk = text("""
+#             SELECT 
+#                 tc.constraint_name, 
+#                 tc.table_name AS fk_table_name, 
+#                 kcu.column_name AS fk_column_name, 
+#                 ccu.table_name AS pk_table_name, 
+#                 ccu.column_name AS pk_column_name,
+#                 ccu.table_schema AS pk_table_schema
+#             FROM 
+#                 information_schema.table_constraints AS tc 
+#                 JOIN information_schema.key_column_usage AS kcu 
+#                 ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema AND tc.table_name = kcu.table_name
+#                 JOIN information_schema.constraint_column_usage AS ccu 
+#                 ON ccu.constraint_name = tc.constraint_name
+#             WHERE 
+#                 tc.constraint_type = 'FOREIGN KEY' 
+#                 AND tc.table_name = :table_name
+#         """)
+
+#         fk_result = db.session.execute(sql_fk, {'table_name': tableName})
+#         for row in fk_result:
+#             constraintName, fkTableName, fkColumnName, pkTableName, pkColumnName, pkTableSchema = row
+
+#             # Ensure the foreign key table is the current table being processed
+#             if fkTableName != tableName:
+#                 continue
+
+
+#             fkTable = tables.get(fkTableName)
+#             pkTable = tables.get(pkTableName)
+
+#             if fkTable and pkTable:
+#                 fkColumn = fkTable.getColumn(fkColumnName)
+#                 pkColumn = pkTable.getColumn(pkColumnName)
+
+#                 if fkColumn and pkColumn:
+#                     # Here, instead of assigning pkColumn directly, store relevant info
+#                     fkColumn.fkof = pkColumn  # Adjust based on your application's needs
+#                     if constraintName not in fkTable.fks:
+#                         fkTable.fks[constraintName] = []
+#                     fkTable.fks[constraintName].append(fkColumn)
+#     return tables
 
 
 def createGraph(tables, theme, showColumns, showTypes, useUpperCase):
@@ -393,139 +460,4 @@ def getThemes():
 
 
 if __name__ == "__main__":
-    app.run(port=5001)
-
-
-class Theme:
-    def __init__(self, color, fillcolor, fillcolorC,
-            bgcolor, icolor, tcolor, style, shape, pencolor, penwidth):
-        self.color = color
-        self.fillcolor = fillcolor
-        self.fillcolorC = fillcolorC
-        self.bgcolor = bgcolor
-        self.icolor = icolor
-        self.tcolor = tcolor
-        self.style = style
-        self.shape = shape
-        self.pencolor = pencolor
-        self.penwidth = penwidth
-
-
-class Table:
-    def __init__(self, name, comment):
-        self.name = name
-        self.comment = comment if comment is not None and comment != 'None' else ''
-        self.label = None
-
-        self.columns = []           # list of all columns
-        self.uniques = {}           # dictionary with UNIQUE constraints, by name + list of columns
-        self.pks = []               # list of PK columns (if any)
-        self.fks = {}               # dictionary with FK constraints, by name + list of FK columns
-
-
-    @classmethod
-    def getClassName(cls, name, useUpperCase, withQuotes=True):
-        if re.match("^[A-Z_0-9]*$", name) == None:
-            return f'"{name}"' if withQuotes else name
-        return name.upper() if useUpperCase else name.lower()
-
-    def getName(self, useUpperCase, withQuotes=True):
-        return Table.getClassName(self.name, useUpperCase, withQuotes)
-
-    def getColumn(self, name):
-        for column in self.columns:
-            if column.name == name:
-                return column
-        return None
-
-    def getDotShape(self, theme, showColumns, showTypes, useUpperCase):
-        fillcolor = theme.fillcolorC if showColumns else theme.fillcolor
-        colspan = "2" if showTypes else "1"
-        tableName = self.getName(useUpperCase, False)
-
-        s = (f'  {self.label} [\n'
-            + f'    fillcolor="{fillcolor}" color="{theme.color}" penwidth="1"\n'
-            + f'    label=<<table style="{theme.style}" border="0" cellborder="0" cellspacing="0" cellpadding="1">\n'
-            + f'      <tr><td bgcolor="{theme.bgcolor}" align="center"'
-            + f' colspan="{colspan}"><font color="{theme.tcolor}"><b>{tableName}</b></font></td></tr>\n')
-
-        if showColumns:
-            for column in self.columns:
-                name = column.getName(useUpperCase, False)
-                if column.ispk: name = f"<u>{name}</u>"
-                if column.fkof != None: name = f"<i>{name}</i>"
-                if column.nullable: name = f"{name}*"
-                if column.identity: name = f"{name} I"
-                if column.isunique: name = f"{name} U"
-                datatype = column.datatype
-                if useUpperCase: datatype = datatype.upper()
-
-                if showTypes:
-                    s += (f'      <tr><td align="left"><font color="{theme.icolor}">{name}&nbsp;</font></td>\n'
-                        + f'        <td align="left"><font color="{theme.icolor}">{datatype}</font></td></tr>\n')
-                else:
-                    s += f'      <tr><td align="left"><font color="{theme.icolor}">{name}</font></td></tr>\n'
-
-        return s + '    </table>>\n  ]\n'
-
-
-    def getDotLinks(self, theme):
-        s = ""
-        for constraint in self.fks:
-            fks = self.fks[constraint]
-            fk1 = fks[0]
-            dashed = "" if not fk1.nullable else ' style="dashed"'
-            arrow = "" if fk1.ispk and len(self.pks) == len(fk1.fkof.table.pks) else ' arrowtail="crow"'
-            s += (f'  {self.label} -> {fk1.fkof.table.label}'
-                + f' [ penwidth="{theme.penwidth}" color="{theme.pencolor}"{dashed}{arrow} ]\n')
-        return s
-    
-
-class Column:
-    def __init__(self, table, name, comment):
-        self.table = table
-        self.name = name
-        self.comment = comment if comment is not None and comment != 'None' else ''
-        self.nullable = True
-        self.datatype = None        # with (length, or precision/scale)
-        self.identity = False
-
-        self.isunique = False
-        self.ispk = False
-        self.pkconstraint = None
-        self.fkof = None            # points to the PK column on the other side
-
-
-    def getName(self, useUpperCase, withQuotes=True):
-        return Table.getClassName(self.name, useUpperCase, withQuotes)
-
-
-    def setDataType(self, datatype):
-        self.datatype = datatype["type"]
-        self.nullable = bool(datatype["nullable"])
-
-        if self.datatype == "FIXED":
-            self.datatype = "NUMBER"
-        elif "fixed" in datatype:
-            fixed = bool(datatype["fixed"])
-            if self.datatype == "TEXT":
-                self.datatype = "CHAR" if fixed else "VARCHAR"
-
-        if "length" in datatype:
-            self.datatype += f"({str(datatype['length'])})"
-        elif "scale" in datatype:
-            if int(datatype['precision']) == 0:
-                self.datatype += f"({str(datatype['scale'])})"
-                if self.datatype == "TIMESTAMP_NTZ(9)":
-                    self.datatype = "TIMESTAMP"
-            elif "scale" in datatype and int(datatype['scale']) == 0:
-                self.datatype += f"({str(datatype['precision'])})"
-                if self.datatype == "NUMBER(38)":
-                    self.datatype = "INT"
-                elif self.datatype.startswith("NUMBER("):
-                    self.datatype = f"INT({str(datatype['precision'])})"
-            elif "scale" in datatype:
-                self.datatype += f"({str(datatype['precision'])},{str(datatype['scale'])})"
-                #if column.datatype.startswith("NUMBER("):
-                #    column.datatype = f"FLOAT({str(datatype['precision'])},{str(datatype['scale'])})"
-        self.datatype = self.datatype.lower()
+    app.run(debug=True)
\ No newline at end of file
diff --git a/my_flask_app/models/__pycache__/models.cpython-39.pyc b/my_flask_app/models/__pycache__/models.cpython-39.pyc
index 52c1845341f74497b1ac419ea9d8e8fb62401df8..922505e8e007a16202bcb47fb6b19cc560709207 100644
Binary files a/my_flask_app/models/__pycache__/models.cpython-39.pyc and b/my_flask_app/models/__pycache__/models.cpython-39.pyc differ
diff --git a/my_flask_app/models/models.py b/my_flask_app/models/models.py
index 5092e14b6da441c3c95cf3a4aa7d1dc017496db4..118e0c5ec238724cc92f55392aa10e04695175aa 100644
--- a/my_flask_app/models/models.py
+++ b/my_flask_app/models/models.py
@@ -15,10 +15,10 @@ class Theme:
         self.penwidth = penwidth
 
 
-class Table():
-    def __init__(self, name, comment):
+class CustomTable():
+    def __init__(self, name, schema):
         self.name = name
-        self.comment = comment if comment is not None and comment != 'None' else ''
+        self.schema = schema if schema is not None and schema != 'None' else ''   # table schema
         self.label = None
 
         self.columns = []           # list of all columns
@@ -34,7 +34,7 @@ class Table():
         return name.upper() if useUpperCase else name.lower()
 
     def getName(self, useUpperCase, withQuotes=True):
-        return Table.getClassName(self.name, useUpperCase, withQuotes)
+        return CustomTable.getClassName(self.name, useUpperCase, withQuotes)
 
     def getColumn(self, name):
         for column in self.columns:
@@ -85,7 +85,7 @@ class Table():
         return s
 
 
-class Column:
+class CustomColumn:
     def __init__(self, table, name, comment):
         self.table = table
         self.name = name
@@ -101,7 +101,7 @@ class Column:
 
 
     def getName(self, useUpperCase, withQuotes=True):
-        return Table.getClassName(self.name, useUpperCase, withQuotes)
+        return CustomTable.getClassName(self.name, useUpperCase, withQuotes)
 
 
     def setDataType(self, datatype):
diff --git a/my_flask_app/templates/app.html b/my_flask_app/templates/app.html
index b7f13c22732d9bf095dd9e706caa1cedb7d0cfe4..99e8ff95d484cfcfb1e36ea847ae3a659291db86 100644
--- a/my_flask_app/templates/app.html
+++ b/my_flask_app/templates/app.html
@@ -383,6 +383,12 @@
             </li>
             <!-- Add more items as needed -->
         </ul>
+
+        <!-- set_database.html -->
+        <form method="post" action="/">
+            <input type="text" name="database_uri" placeholder="Enter Database URI">
+            <input type="submit" value="Set Database">
+        </form>
         
         <div id="resize-handle-left" class="resize-handle-left"></div>
     </div> 
diff --git a/my_flask_app/templates/select_database.html b/my_flask_app/templates/select_database.html
deleted file mode 100644
index 98135dc8df64b8d2690421858dec1316c4374ffa..0000000000000000000000000000000000000000
--- a/my_flask_app/templates/select_database.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Select Database</title>
-    <!-- Add some CSS for styling -->
-</head>
-<body>
-    <div>
-        <!-- <h3>Current Database: {{ current_db }}</h3> -->
-        <h3>Select a Database</h3>
-        <ul>
-            {% for db in databases %}
-                <li>{{ db }}</li>
-            {% endfor %}
-        </ul>
-    </div>
-</body>
-</html>
diff --git a/my_flask_app/templates/set_database.html b/my_flask_app/templates/set_database.html
new file mode 100644
index 0000000000000000000000000000000000000000..b3337a20b84bb2a530858eca1d35f3658fd549df
--- /dev/null
+++ b/my_flask_app/templates/set_database.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Set Database</title>
+</head>
+<body>
+    <form method="POST" action="/set-database">
+        <label for="database_uri">Database URI:</label>
+        <input type="text" name="database_uri" id="database_uri">
+        <input type="submit" value="Set Database">
+    </form>
+</body>
+</html>
\ No newline at end of file