Activity #20: Python Orm Sqlalchemy

·

12 min read

Step 1: Set Up the Environment

Install Python

Make sure you have Python installed or Any application like Vs code, Pycharm Etc.

python -m venv myvenv
myvenv\Scripts\activate

Step 2: Install SQLAlchemy

Install SQLAlchemy using pip in your terminal.

pip install sqlalchemy

Step 3: Create the Database Setup

1.Create a file named databaseORMQuizDb.py

named databaseORMQuizDb.py

from sqlalchemy import create_engine, Column, Integer, String, Text, Enum, DateTime, Boolean, ForeignKey, DECIMAL
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from datetime import datetime, timezone

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    email = Column(String, nullable=False)
    password = Column(String, nullable=False)
    role = Column(Enum('teacher', 'student', name='user_roles'), nullable=False)
    createdAt = Column(DateTime, default=datetime.now(timezone.utc))
    updatedAt = Column(DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))

class Quiz(Base):
    __tablename__ = 'quiz'
    quiz_id = Column(Integer, primary_key=True)
    title = Column(String, nullable=False)
    description = Column(Text)
    quiz_code = Column(String, unique=True)
    teacher_id = Column(Integer, ForeignKey('user.user_id'))
    duration = Column(Integer)
    createdAt = Column(DateTime, default=datetime.now(timezone.utc))
    updatedAt = Column(DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))
    teacher = relationship("User")

class Question(Base):
    __tablename__ = 'question'
    question_id = Column(Integer, primary_key=True)
    quiz_id = Column(Integer, ForeignKey('quiz.quiz_id'))
    question_text = Column(Text, nullable=False)
    question_type = Column(Enum('MCQ', 'true or false', 'short answer', 'multimedia', name='question_types'))
    createdAt = Column(DateTime, default=datetime.now(timezone.utc))
    updatedAt = Column(DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))

class Option(Base):
    __tablename__ = 'option'
    option_id = Column(Integer, primary_key=True)
    question_id = Column(Integer, ForeignKey('question.question_id'))
    option_text = Column(String, nullable=False)
    is_correct = Column(Boolean)

class Answer(Base):
    __tablename__ = 'answer'
    answer_id = Column(Integer, primary_key=True)
    question_id = Column(Integer, ForeignKey('question.question_id'))
    student_id = Column(Integer, ForeignKey('user.user_id'))
    answer_text = Column(Text)
    submitted_At = Column(DateTime, default=datetime.now(timezone.utc))

class Result(Base):
    __tablename__ = 'result'
    result_id = Column(Integer, primary_key=True)
    quiz_id = Column(Integer, ForeignKey('quiz.quiz_id'))
    student_id = Column(Integer, ForeignKey('user.user_id'))
    score = Column(DECIMAL(5, 2))
    submitted_At = Column(DateTime, default=datetime.now(timezone.utc))

engine = create_engine('sqlite:///ORMQuizDb.sqlite')
Base.metadata.create_all(engine)

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

def add_dummy_data():
    users = [
        User(name='Alice', email='alice@example.com', password='password', role='student'),
        User(name='Bob', email='bob@example.com', password='password', role='teacher'),
        User(name='Charlie', email='charlie@example.com', password='password', role='student'),
        User(name='David', email='david@example.com', password='password', role='teacher'),
        User(name='Eve', email='eve@example.com', password='password', role='student')
    ]
    session.add_all(users)
    session.commit()

    quizzes = [
        Quiz(title='Math Quiz 1', description='Basic Math Quiz', quiz_code='MATH101', teacher_id=2, duration=30),
        Quiz(title='Science Quiz 1', description='Basic Science Quiz', quiz_code='SCI101', teacher_id=4, duration=30),
        Quiz(title='History Quiz 1', description='World History Quiz', quiz_code='HIST101', teacher_id=2, duration=30),
        Quiz(title='Geography Quiz 1', description='Geography Basics Quiz', quiz_code='GEOG101', teacher_id=4, duration=30),
        Quiz(title='Literature Quiz 1', description='Basic Literature Quiz', quiz_code='LIT101', teacher_id=2, duration=30),
    ]
    session.add_all(quizzes)
    session.commit()

    questions = [
        Question(quiz_id=1, question_text='What is 2 + 2?', question_type='MCQ'),
        Question(quiz_id=1, question_text='Is the Earth flat?', question_type='true or false'),
        Question(quiz_id=2, question_text='What is H2O commonly known as?', question_type='short answer'),
        Question(quiz_id=2, question_text='What is the capital of France?', question_type='MCQ'),
        Question(quiz_id=3, question_text='Who was the first President of the USA?', question_type='short answer'),
    ]
    session.add_all(questions)
    session.commit()

    options = [
        Option(question_id=1, option_text='3', is_correct=False),
        Option(question_id=1, option_text='4', is_correct=True),
        Option(question_id=1, option_text='5', is_correct=False),
        Option(question_id=2, option_text='True', is_correct=False),
        Option(question_id=2, option_text='False', is_correct=True),
        Option(question_id=4, option_text='London', is_correct=False),
        Option(question_id=4, option_text='Paris', is_correct=True),
        Option(question_id=4, option_text='Berlin', is_correct=False),
        Option(question_id=5, option_text='George Washington', is_correct=True),
        Option(question_id=5, option_text='Abraham Lincoln', is_correct=False),
    ]
    session.add_all(options)
    session.commit()

    answers = [
        Answer(question_id=1, student_id=1, answer_text='4'),
        Answer(question_id=2, student_id=3, answer_text='False'),
        Answer(question_id=3, student_id=1, answer_text='Water'),
        Answer(question_id=4, student_id=1, answer_text='Paris'),
        Answer(question_id=5, student_id=3, answer_text='George Washington')
    ]
    session.add_all(answers)
    session.commit()

    results = [
        Result(quiz_id=1, student_id=1, score=80.00),
        Result(quiz_id=2, student_id=3, score=90.00),
        Result(quiz_id=3, student_id=1, score=85.00),
        Result(quiz_id=4, student_id=2, score=75.00),
        Result(quiz_id=5, student_id=3, score=95.00)
    ]
    session.add_all(results)
    session.commit()

add_dummy_data()

def crud_example():
    print("All Users:")
    for user in session.query(User).all():
        print(user.name, user.email)

    user_to_update = session.query(User).filter_by(user_id=1).first()
    user_to_update.name = 'Alicia'
    session.commit()

    user_to_delete = session.query(User).filter_by(user_id=3).first()
    session.delete(user_to_delete)
    session.commit()

    print("\nUsers after update and delete:")
    for user in session.query(User).all():
        print(user.name, user.email)

crud_example()

session.close()

USER TALBE:

RESULT TABLE:

QUIZ TABLE:

QUESTION TABLE:

OPTION TABLE:

ANSWER TABLE:

2.Create a file named database ORMEcommerceDb.py

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Float, DateTime, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime, timezone

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    user_id = Column(Integer, primary_key=True)
    password = Column(String)
    name = Column(String)
    address = Column(String)
    phone = Column(String)
    role = Column(String)
    created_at = Column(DateTime, default=datetime.now(timezone.utc))

class Product(Base):
    __tablename__ = 'products'
    product_id = Column(Integer, primary_key=True)
    name = Column(String)
    brand = Column(String)
    description = Column(String)
    price = Column(Float)
    stock = Column(Integer)
    category = Column(String)
    sku = Column(String)
    image_url = Column(String)
    created_at = Column(DateTime, default=datetime.now(timezone.utc))

class Review(Base):
    __tablename__ = 'reviews'
    review_id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.user_id'))
    product_id = Column(Integer, ForeignKey('products.product_id'))
    rating = Column(Integer)
    comment = Column(Text)
    created_at = Column(DateTime, default=datetime.now(timezone.utc))

class OrderItem(Base):
    __tablename__ = 'order_items'
    order_item = Column(Integer, primary_key=True)
    order_id = Column(Integer)
    product_id = Column(Integer, ForeignKey('products.product_id'))
    quantity = Column(Integer)
    price = Column(Float)

class Order(Base):
    __tablename__ = 'orders'
    order_id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.user_id'))
    total_amount = Column(Float)
    status = Column(String)
    created_at = Column(DateTime, default=datetime.now(timezone.utc))

engine = create_engine('sqlite:///ORMEcommerceDb.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

session.add_all([
    User(password='pass1', name='Alice', address='123 Main St', phone='1234567890', role='customer'),
    User(password='pass2', name='Bob', address='456 Elm St', phone='0987654321', role='seller'),
    User(password='pass3', name='Charlie', address='789 Maple St', phone='5432167890', role='customer'),
    User(password='pass4', name='Diana', address='321 Oak St', phone='4567890123', role='admin'),
    User(password='pass5', name='Ethan', address='654 Pine St', phone='6789012345', role='customer'),

    Product(name='Laptop', brand='BrandA', description='Gaming Laptop', price=1200.00, stock=10,
            category='Electronics', sku='LAP123', image_url='https://example.com/laptop.jpg'),
    Product(name='Phone', brand='BrandB', description='Smartphone', price=700.00, stock=20,
            category='Electronics', sku='PHO456', image_url='https://example.com/phone.jpg'),
    Product(name='Tablet', brand='BrandC', description='Android Tablet', price=300.00, stock=15,
            category='Electronics', sku='TAB789', image_url='https://example.com/tablet.jpg'),
    Product(name='Headphones', brand='BrandD', description='Wireless Headphones', price=150.00, stock=25,
            category='Electronics', sku='HEA012', image_url='https://example.com/headphones.jpg'),
    Product(name='Smartwatch', brand='BrandE', description='Fitness Tracker', price=200.00, stock=30,
            category='Electronics', sku='SMA345', image_url='https://example.com/smartwatch.jpg'),

    Review(user_id=1, product_id=1, rating=5, comment='Excellent laptop!'),
    Review(user_id=2, product_id=2, rating=4, comment='Very good phone.'),
    Review(user_id=3, product_id=3, rating=3, comment='Average tablet.'),
    Review(user_id=4, product_id=4, rating=5, comment='Love these headphones!'),
    Review(user_id=5, product_id=5, rating=4, comment='Great smartwatch.'),

    OrderItem(order_id=1, product_id=1, quantity=1, price=1200.00),
    OrderItem(order_id=1, product_id=2, quantity=2, price=1400.00),
    OrderItem(order_id=2, product_id=3, quantity=1, price=300.00),
    OrderItem(order_id=2, product_id=4, quantity=3, price=450.00),
    OrderItem(order_id=3, product_id=5, quantity=1, price=200.00),

    Order(user_id=1, total_amount=2800.00, status='Completed'),
    Order(user_id=3, total_amount=300.00, status='Pending'),
    Order(user_id=2, total_amount=450.00, status='Shipped'),
    Order(user_id=4, total_amount=150.00, status='Delivered'),
    Order(user_id=5, total_amount=200.00, status='Cancelled'),
])

session.commit()
session.close()

USERS TABLE:

REVIEWS TABLE:

PRODUCTS TABLE:

ORDERS TABLE:

ORDER_ITEMS:

3. Create a file named database ORMJobBoardDb.py

from datetime import datetime, timezone
from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, Boolean, Enum, ForeignKey
from sqlalchemy.orm import declarative_base, sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, primary_key=True)
    authentication_id = Column(Integer, ForeignKey('authentication.authentication_id'))
    name = Column(String)
    birthdate = Column(DateTime(timezone=True))
    skills = Column(Text)
    work_experience = Column(Text)
    updated_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))

class Authentication(Base):
    __tablename__ = 'authentication'
    authentication_id = Column(Integer, primary_key=True)
    username = Column(String)
    email = Column(String)
    password_hash = Column(String)
    role = Column(Enum('admin', 'employer', 'job_seeker'))
    stock = Column(Integer)
    created_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    updated_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    deleted_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))

class Message(Base):
    __tablename__ = 'message'
    message_id = Column(Integer, primary_key=True)
    sender_id = Column(Integer, ForeignKey('user.user_id'))
    recipient_id = Column(Integer, ForeignKey('user.user_id'))
    message = Column(Text)
    is_read = Column(Boolean)
    message_type = Column(Enum('TEXT', 'IMAGE', 'FILE'))
    send_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    deleted_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))

class Applications(Base):
    __tablename__ = 'applications'
    application_id = Column(Integer, primary_key=True)
    job_seeker_id = Column(Integer, ForeignKey('user.user_id'))
    job_id = Column(Integer, ForeignKey('job_posting.job_id'))
    resume = Column(Text)
    status = Column(Enum('PENDING', 'ACCEPTED', 'REJECTED'))
    skills = Column(Text)
    work_experience = Column(Text)
    applied_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    deleted_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))

class JobPosting(Base):
    __tablename__ = 'job_posting'
    job_id = Column(Integer, primary_key=True)
    employer_id = Column(Integer, ForeignKey('user.user_id'))
    job_title = Column(String)
    job_description = Column(Text)
    location = Column(String)
    category = Column(String)
    industry = Column(String)
    min_salary = Column(Integer)
    max_salary = Column(Integer)
    created_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    updated_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    deleted_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))

class JobInteraction(Base):
    __tablename__ = 'job_interaction'
    interaction_id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('user.user_id'))
    job_id = Column(Integer, ForeignKey('job_posting.job_id'))
    interaction_type = Column(Integer)
    interaction_date = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))
    is_applied = Column(Boolean)

engine = create_engine('sqlite:///ORMJobBoardDb.Db', connect_args={"check_same_thread": False})

# Ensure the database tables are created
Base.metadata.create_all(engine)

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

# Adding data with correct datetime objects
session.add_all([
    User(user_id=1, authentication_id=1, name='Kevin', birthdate=datetime(1990, 1, 1, tzinfo=timezone.utc),
         skills='Python, SQL', work_experience='5 years'),
    User(user_id=2, authentication_id=2, name='Rona', birthdate=datetime(1988, 2, 1, tzinfo=timezone.utc),
         skills='Java, NoSQL', work_experience='7 years'),
    User(user_id=3, authentication_id=3, name='Meibel', birthdate=datetime(1992, 3, 1, tzinfo=timezone.utc),
         skills='JavaScript, React', work_experience='4 years'),
    User(user_id=4, authentication_id=4, name='Max', birthdate=datetime(1985, 4, 1, tzinfo=timezone.utc),
         skills='HTML, CSS', work_experience='6 years'),
    User(user_id=5, authentication_id=5, name='Ben', birthdate=datetime(1975, 5, 1, tzinfo=timezone.utc),
         skills='C++, C#', work_experience='10 years'),

    Authentication(authentication_id=1, username='Kevin', email='kevin@gmail.com', password_hash='hashedpw1',
                   role='job_seeker', stock=0),
    Authentication(authentication_id=2, username='Rona', email='rona@gmail.com', password_hash='hashedpw2',
                   role='employer', stock=0),
    Authentication(authentication_id=3, username='Meibel', email='meibel@gmail.com', password_hash='hashedpw3',
                   role='job_seeker', stock=0),
    Authentication(authentication_id=4, username='Max', email='max@gmail.com', password_hash='hashedpw4',
                   role='employer', stock=0),
    Authentication(authentication_id=5, username='Ben', email='ben@gmail.com', password_hash='hashedpw5',
                   role='job_seeker', stock=0),

    Message(message_id=1, sender_id=1, recipient_id=2, message='Hello!', is_read=False, message_type='TEXT'),
    Message(message_id=2, sender_id=2, recipient_id=3, message='Job opportunity for you!', is_read=False,
            message_type='TEXT'),
    Message(message_id=3, sender_id=3, recipient_id=4, message='Interested in the job!', is_read=True,
            message_type='TEXT'),
    Message(message_id=4, sender_id=4, recipient_id=5, message='Please send your resume.', is_read=False,
            message_type='TEXT'),
    Message(message_id=5, sender_id=5, recipient_id=1, message='Can we schedule an interview?', is_read=False,
            message_type='TEXT'),

    Applications(application_id=1, job_seeker_id=1, job_id=1, resume='Kevin_Resume.pdf', status='PENDING',
                 skills='Python', work_experience='5 years'),
    Applications(application_id=2, job_seeker_id=2, job_id=2, resume='Rona_Resume.pdf', status='ACCEPTED',
                 skills='Java', work_experience='7 years'),
    Applications(application_id=3, job_seeker_id=3, job_id=3, resume='Meibel_Resume.pdf', status='REJECTED',
                 skills='JavaScript', work_experience='4 years'),
    Applications(application_id=4, job_seeker_id=4, job_id=4, resume='Max_Resume.pdf', status='PENDING',
                 skills='HTML', work_experience='6 years'),
    Applications(application_id=5, job_seeker_id=5, job_id=5, resume='Ben_Resume.pdf', status='ACCEPTED',
                 skills='C++', work_experience='10 years'),

    JobPosting(job_id=1, employer_id=2, job_title='Python Developer',
               job_description='Develop applications using Python.', location='New York', category='IT',
               industry='Software', min_salary=70000, max_salary=100000),
    JobPosting(job_id=2, employer_id=4, job_title='Java Developer', job_description='Develop applications using Java.',
               location='San Francisco', category='IT', industry='Software', min_salary=80000, max_salary=120000),
    JobPosting(job_id=3, employer_id=2, job_title='Frontend Developer',
               job_description='Work on the UI of the application.', location='Austin', category='IT',
               industry='Software', min_salary=60000, max_salary=90000),
    JobPosting(job_id=4, employer_id=4, job_title='Full Stack Developer',
               job_description='Work on both frontend and backend.', location='Seattle', category='IT',
               industry='Software', min_salary=90000, max_salary=130000),
    JobPosting(job_id=5, employer_id=2, job_title='Data Scientist', job_description='Analyze data and create reports.',
               location='Chicago', category='IT', industry='Software', min_salary=80000, max_salary=110000),

    JobInteraction(interaction_id=1, user_id=1, job_id=1, interaction_type=1, interaction_date=datetime.now(timezone.utc),
                   is_applied=True),
    JobInteraction(interaction_id=2, user_id=2, job_id=2, interaction_type=1, interaction_date=datetime.now(timezone.utc),
                   is_applied=False),
    JobInteraction(interaction_id=3, user_id=3, job_id=3, interaction_type=1, interaction_date=datetime.now(timezone.utc),
                   is_applied=True),
    JobInteraction(interaction_id=4, user_id=4, job_id=4, interaction_type=1, interaction_date=datetime.now(timezone.utc),
                   is_applied=True),
    JobInteraction(interaction_id=5, user_id=5, job_id=5, interaction_type=1, interaction_date=datetime.now(timezone.utc),
                   is_applied=False)
])

session.commit()
session.close()

USER TABLE:

MESSAGE TABLE:

JOB_POSTING:

JOB_INTERACTION:

AUTHENTICATION:

APPLICATIONS:

4. Create a file named database ORMEventManagementDb.py

from sqlalchemy import create_engine, Column, Integer, String, Text, Date, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime

DATABASE_URI = 'sqlite:///ORMEventManagementDb.db'
engine = create_engine(DATABASE_URI)
Base = declarative_base()

class Admin(Base):
    __tablename__ = 'admin'
    admin_id = Column(Integer, primary_key=True)
    admin_username = Column(String)
    admin_email = Column(String)
    admin_password = Column(String)

class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, primary_key=True)
    user_gmail = Column(String)
    user_password = Column(String)
    user_lastname = Column(String)

class Events(Base):
    __tablename__ = 'events'
    event_id = Column(Integer, primary_key=True)
    event_title = Column(String)
    event_description = Column(String)
    event_additional_description = Column(Text)
    event_address = Column(String)
    event_planner = Column(String)
    event_image = Column(String)
    event_status = Column(String)
    event_start = Column(Date)

class Agenda(Base):
    __tablename__ = 'agenda'
    agenda_id = Column(Integer, primary_key=True)
    event_id = Column(Integer, ForeignKey('events.event_id'))
    agenda_time_start = Column(String)
    agenda_time_end = Column(String)

class Attendees(Base):
    __tablename__ = 'attendees'
    attendees_id = Column(Integer, primary_key=True)
    invitation_id = Column(Integer, ForeignKey('invited.invitation_id'))

class Invited(Base):
    __tablename__ = 'invited'
    invitation_id = Column(Integer, primary_key=True)
    invitation_name = Column(String)
    event_id = Column(Integer, ForeignKey('events.event_id'))
    attendee_type = Column(String)
    seat_number = Column(String)

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

admin_data = [
    Admin(admin_id=1, admin_username='admin1', admin_email='admin1@gmail.com', admin_password='adminpass1'),
    Admin(admin_id=2, admin_username='admin2', admin_email='admin2@gmail.com', admin_password='adminpass2'),
    Admin(admin_id=3, admin_username='admin3', admin_email='admin3@gmail.com', admin_password='adminpass3'),
    Admin(admin_id=4, admin_username='admin4', admin_email='admin4@gmail.com', admin_password='adminpass4'),
    Admin(admin_id=5, admin_username='admin5', admin_email='admin5@gmail.com', admin_password='adminpass5'),
]

user_data = [
    User(user_id=1, user_gmail='Kevin@gmail.com', user_password='password1', user_lastname='Durant'),
    User(user_id=2, user_gmail='Rona@gmail.com', user_password='password2', user_lastname='Decio'),
    User(user_id=3, user_gmail='Meibel@gmail.com', user_password='password3', user_lastname='Cuaderno'),
    User(user_id=4, user_gmail='Max@gmail.com', user_password='password4', user_lastname='Tenison'),
    User(user_id=5, user_gmail='Ben@gmail.com', user_password='password5', user_lastname='Tenison'),
]

event_data = [
    Events(event_id=1, event_title='Harvest Festival 2023', event_description='Celebrate the bountiful harvest with food, fun, and family activities!', event_additional_description='Join us for an unforgettable day filled with local produce, craft vendors, live music, and childrens activities', event_address='123 Farm Lane, Springfield, IL 62701', event_planner='Planner One', event_image='image1.jpg', event_status='active', event_start=datetime.strptime('2023-11-01', '%Y-%m-%d').date()),
    Events(event_id=2, event_title='Tech Innovation Summit', event_description='Explore the latest trends in technology and entrepreneurship.', event_additional_description='This summit gathers industry leaders, startups, and innovators to discuss the future of technology.', event_address='456 Tech Ave, Silicon Valley, CA 94043', event_planner='Planner Two', event_image='image2.jpg', event_status='active', event_start=datetime.strptime('2023-11-02', '%Y-%m-%d').date()),
    Events(event_id=3, event_title='Art in the Park', event_description='An outdoor art exhibition featuring local artists.', event_additional_description='Come and enjoy a day of creativity and inspiration at our annual Art in the Park! Browse art installations, enjoy live music, and meet local artists.', event_address='City Park, 789 Art St, Denver, CO 80204', event_planner='Planner Three', event_image='image3.jpg', event_status='active', event_start=datetime.strptime('2023-11-03', '%Y-%m-%d').date()),
    Events(event_id=4, event_title='Mindfulness Meditation Retreat', event_description='A weekend retreat to relax and rejuvenate your mind and body.', event_additional_description='Escape the hustle and bustle of daily life at our Mindfulness Meditation Retreat.', event_address='Serenity Hills Lodge, 234 Tranquil Rd, Asheville, NC 28801', event_planner='Planner Four', event_image='image4.jpg', event_status='active', event_start=datetime.strptime('2023-11-04', '%Y-%m-%d').date()),
    Events(event_id=5, event_title='Music Under the Stars', event_description='A night of live music and community spirit under the stars.', event_additional_description='Gather your friends and family for an evening of live performances from local bands.', event_address='Starry Park, 345 Rhythm Ln, Nashville, TN 37201', event_planner='Planner Five', event_image='image5.jpg', event_status='active', event_start=datetime.strptime('2023-11-05', '%Y-%m-%d').date()),
]

agenda_data = [
    Agenda(agenda_id=1, event_id=1, agenda_time_start='10:00', agenda_time_end='11:00'),
    Agenda(agenda_id=2, event_id=2, agenda_time_start='11:00', agenda_time_end='12:00'),
    Agenda(agenda_id=3, event_id=3, agenda_time_start='12:00', agenda_time_end='13:00'),
    Agenda(agenda_id=4, event_id=4, agenda_time_start='13:00', agenda_time_end='14:00'),
    Agenda(agenda_id=5, event_id=5, agenda_time_start='14:00', agenda_time_end='15:00'),
]

attendee_data = [
    Attendees(attendees_id=1, invitation_id=1),
    Attendees(attendees_id=2, invitation_id=2),
    Attendees(attendees_id=3, invitation_id=3),
    Attendees(attendees_id=4, invitation_id=4),
    Attendees(attendees_id=5, invitation_id=5),
]

invited_data = [
    Invited(invitation_id=1, invitation_name='Kevin', event_id=1, attendee_type='VIP', seat_number='A1'),
    Invited(invitation_id=2, invitation_name='Rona', event_id=2, attendee_type='Regular', seat_number='B1'),
    Invited(invitation_id=3, invitation_name='Meibel', event_id=3, attendee_type='VIP', seat_number='C1'),
    Invited(invitation_id=4, invitation_name='Max', event_id=4, attendee_type='Regular', seat_number='D1'),
    Invited(invitation_id=5, invitation_name='Ben', event_id=5, attendee_type='VIP', seat_number='E1'),
]

session.add_all(admin_data)
session.add_all(user_data)
session.add_all(event_data)
session.add_all(agenda_data)
session.add_all(attendee_data)
session.add_all(invited_data)

session.commit()
session.close()

USER TABLE:

INVITED TABLE:

EVENTS TABLE:

ATTENDEES TABLE:

AGENDA TABLE:

ADMIN TABLE:

5. Create a file named database ORMTravelBookingDb.py

from sqlalchemy import create_engine, Column, Integer, String, Text, Date, Enum, DECIMAL, DateTime, ForeignKey
from sqlalchemy.orm import declarative_base, sessionmaker
import datetime
from datetime import timezone

DATABASE_URI = 'sqlite:///ORMTravelBookingDb.db'
engine = create_engine(DATABASE_URI, echo=False)
Base = declarative_base()


class User(Base):
    __tablename__ = 'users'
    user_id = Column(Integer, primary_key=True)
    username = Column(String(255), unique=True)
    password_hash = Column(String(255))
    email = Column(String(100), unique=True)
    phone_number = Column(String(20))
    first_name = Column(String(50))
    last_name = Column(String(50))
    user_role = Column(Enum('ADMIN', 'USERS'))
    created_at = Column(DateTime, default=datetime.datetime.now(timezone.utc))
    updated_at = Column(DateTime, default=datetime.datetime.now(timezone.utc), onupdate=datetime.datetime.now(timezone.utc))
    deleted_at = Column(DateTime, default=datetime.datetime.now(timezone.utc))


class Tour(Base):
    __tablename__ = 'tours'
    tour_id = Column(Integer, primary_key=True)
    tour_name = Column(String)
    description = Column(Text)
    price = Column(DECIMAL(10, 2))
    start_date = Column(Date)
    end_date = Column(Date)
    seats_available = Column(Integer)
    image_url = Column(String(255))
    created_at = Column(DateTime, default=datetime.datetime.now(timezone.utc))
    updated_at = Column(DateTime, default=datetime.datetime.now(timezone.utc), onupdate=datetime.datetime.now(timezone.utc))
    deleted_at = Column(DateTime, default=datetime.datetime.now(timezone.utc))


class Payment(Base):
    __tablename__ = 'payments'
    payment_id = Column(Integer, primary_key=True)
    booking_id = Column(Integer, ForeignKey('bookings.booking_id'), nullable=False)
    payment_date = Column(DateTime, default=datetime.datetime.now(timezone.utc))
    amount = Column(DECIMAL(10, 2))
    payment_method = Column(Enum('GCASH'))
    payment_status = Column(Enum('SUCCESS', 'FAILED'))
    transaction_id = Column(String(100))


class Booking(Base):
    __tablename__ = 'bookings'
    booking_id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.user_id'), nullable=False)
    tour_id = Column(Integer, ForeignKey('tours.tour_id'), nullable=False)
    booking_date = Column(DateTime, default=datetime.datetime.now(timezone.utc))
    travel_date = Column(Date)
    seats_booked = Column(Integer)
    total_amount = Column(DECIMAL(10, 2))
    payment_status = Column(Enum('SUCCESS', 'FAILED'))
    created_at = Column(DateTime, default=datetime.datetime.now(timezone.utc))
    updated_at = Column(DateTime, default=datetime.datetime.now(timezone.utc), onupdate=datetime.datetime.now(timezone.utc))


class Review(Base):
    __tablename__ = 'reviews'
    review_id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.user_id'), nullable=False)
    tour_id = Column(Integer, ForeignKey('tours.tour_id'), nullable=False)
    rating = Column(Integer)
    comment = Column(Text)
    created_at = Column(DateTime, default=datetime.datetime.now(timezone.utc))


class AdminLog(Base):
    __tablename__ = 'admin_logs'
    log_id = Column(Integer, primary_key=True)
    admin_id = Column(Integer, ForeignKey('users.user_id'), nullable=False)
    action_type = Column(Enum('CREATE', 'UPDATE', 'DELETE'))
    description = Column(Text)
    timestamp = Column(DateTime, default=datetime.datetime.now(timezone.utc))


Base.metadata.create_all(engine)

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


user_data = [
    User(username='kevin07', password_hash='hashed_password1', email='kevin@gmail.com', phone_number='09933214290', first_name='Kevin', last_name='Durant', user_role='ADMIN'),
    User(username='rona14', password_hash='hashed_password2', email='rona@gmail.com', phone_number='09933214291', first_name='Rona', last_name='Decio', user_role='USERS'),
    User(username='meibel14', password_hash='hashed_password3', email='meibel@gmail.com', phone_number='09933214292', first_name='Meibel', last_name='Cuaderno', user_role='ADMIN'),
    User(username='max11', password_hash='hashed_password4', email='max@gmail.com', phone_number='09933214293', first_name='Max', last_name='Tenison', user_role='USERS'),
    User(username='ben10', password_hash='hashed_password5', email='ben@gmail.com', phone_number='09933214294', first_name='Ben', last_name='Tenison', user_role='USERS')
]


session.add_all(user_data)
session.commit()


tour_data = [
    Tour(tour_name='City Tour', description='Explore the city attractions.', price=50.00, start_date=datetime.date(2023, 12, 1), end_date=datetime.date(2023, 12, 31), seats_available=10, image_url='image1.jpg'),
    Tour(tour_name='Mountain Trek', description='Hike through the mountains.', price=75.00, start_date=datetime.date(2023, 11, 1), end_date=datetime.date(2023, 11, 15), seats_available=5, image_url='image2.jpg'),
    Tour(tour_name='Beach Getaway', description='Relax at the sunny beach.', price=100.00, start_date=datetime.date(2023, 11, 10), end_date=datetime.date(2023, 11, 20), seats_available=20, image_url='image3.jpg'),
    Tour(tour_name='Historical Sites', description='Visit ancient historical sites.', price=60.00, start_date=datetime.date(2023, 12, 5), end_date=datetime.date(2023, 12, 25), seats_available=15, image_url='image4.jpg'),
    Tour(tour_name='Wildlife Safari', description='Experience wildlife up close.', price=120.00, start_date=datetime.date(2023, 12, 10), end_date=datetime.date(2023, 12, 20), seats_available=8, image_url='image5.jpg')
]


session.add_all(tour_data)
session.commit()


booking_data = [
    Booking(user_id=1, tour_id=1, travel_date=datetime.date(2023, 12, 15), seats_booked=2, total_amount=100.00, payment_status='SUCCESS'),
    Booking(user_id=2, tour_id=2, travel_date=datetime.date(2023, 11, 10), seats_booked=1, total_amount=75.00, payment_status='SUCCESS'),
    Booking(user_id=3, tour_id=3, travel_date=datetime.date(2023, 11, 20), seats_booked=3, total_amount=300.00, payment_status='FAILED'),
    Booking(user_id=4, tour_id=4, travel_date=datetime.date(2023, 12, 10), seats_booked=4, total_amount=240.00, payment_status='SUCCESS'),
    Booking(user_id=5, tour_id=5, travel_date=datetime.date(2023, 12, 12), seats_booked=2, total_amount=240.00, payment_status='SUCCESS')
]


session.add_all(booking_data)
session.commit()


payment_data = [
    Payment(booking_id=1, amount=100.00, payment_method='GCASH', payment_status='SUCCESS', transaction_id='TRANS001'),
    Payment(booking_id=2, amount=75.00, payment_method='GCASH', payment_status='SUCCESS', transaction_id='TRANS002'),
    # Adjust booking_id to match those added above, and ensure they exist.
    Payment(booking_id=3, amount=300.00, payment_method='GCASH', payment_status='FAILED', transaction_id='TRANS003'),
    Payment(booking_id=4, amount=240.00, payment_method='GCASH', payment_status='SUCCESS', transaction_id='TRANS004'),
    Payment(booking_id=5, amount=240.00, payment_method='GCASH', payment_status='SUCCESS', transaction_id='TRANS005')
]


session.add_all(payment_data)
session.commit()


review_data = [
    Review(user_id=1, tour_id=1, rating=5, comment='Great tour!'),
    Review(user_id=2, tour_id=2, rating=4, comment='Enjoyed the trek!'),
    Review(user_id=3, tour_id=3, rating=3, comment='It was okay.'),
    Review(user_id=4, tour_id=4, rating=5, comment='Loved the history!'),
    Review(user_id=5, tour_id=5, rating=5, comment='Amazing experience!')
]


session.add_all(review_data)
session.commit()


admin_log_data = [
    AdminLog(admin_id=3, action_type='CREATE', description='Created a new tour.'),
    AdminLog(admin_id=3, action_type='UPDATE', description='Updated tour prices.'),
    AdminLog(admin_id=3, action_type='DELETE', description='Deleted a tour.'),
    AdminLog(admin_id=3, action_type='CREATE', description='Created a new booking.'),
    AdminLog(admin_id=3, action_type='CREATE', description='Created a new user.')
]


session.add_all(admin_log_data)
session.commit()


session.close()

USERS TABLE:

TOURS TABLE:

REVIEWS TABLE:

PAYMENTS TABLE:

BOOKINGS TABLE:

ADMIN_LOGS TABLE:

RonaDecio/Decio_PYTHON_ORM_SQLALCHEMY