Streamlining Hotel Management with Python CLI and ORM
Tags: sql, python, objectrelationalmapping, cli
Published: 2024-05-12 18:10:03


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrh0uhsmu2ij7gdu4hqr.png)

GitHub Link: https://github.com/LueDev/Python-CLI-ORM.git

Expanding on Simplifying Database Interaction with Python CLI

**Introduction to Python CLI for Database Interaction:**
Python CLI applications provide a straightforward and efficient means of interacting with databases, offering users a command-line interface to perform database operations seamlessly. These applications abstract away the complexities of SQL queries and database management, allowing users to focus solely on the desired results. By leveraging Object Relational Mappers (ORMs), developers can bridge the gap between Python objects and relational databases, simplifying the process of data retrieval, manipulation, and storage.

**Flexibility with SQL Code:**
While established ORM frameworks like SQLAlchemy offer powerful abstractions for database interactions, there are scenarios where direct SQL code provides greater flexibility and control. In this project, instead of relying on ORM methods exclusively, developers have the freedom to write custom SQL queries tailored to specific use cases. This approach enables finer-grained control over database operations and allows for optimizations that may not be achievable through ORM methods alone.

**Object Relational Mapping (ORM):**
The concept of Object Relational Mapping lies at the heart of our application, enabling seamless conversion between database rows and Python objects. By defining classes that mirror the structure of our database tables and implementing methods for object creation, retrieval, and manipulation, we create a cohesive mapping between the relational world of databases and the object-oriented paradigm of Python.

**Understanding the Project Structure:**
At the core of our Python CLI application are the database models "Hotel" and "Guest," which are defined in the Hotel.py and Guest.py files, respectively. These models represent the underlying database tables and establish a one-to-many relationship between hotels and guests. Through the methods provided by these models, users can create, retrieve, update, and delete records with ease, making database management a straightforward task.

Guest ORM Methods:

| Method Name        | Description                                                  |
|--------------------|--------------------------------------------------------------|
| create()           | Creates a new guest instance in the database.                |
| instance_from_db() | Converts a database row to a Guest object.                   |
| get_all()          | Retrieves all guest instances from the database.             |
| find_by_id()       | Finds a guest instance by its ID.                            |
| find_by_name()     | Finds a guest instance by its name.                          |
| save()             | Saves changes to an existing guest instance in the database. |
| update()           | Updates an existing guest instance in the database.          |
| delete()           | Deletes a guest instance from the database.                  |


Hotel ORM Methods:

| Method Name        | Description                                                  |
|--------------------|--------------------------------------------------------------|
| create()           | Creates a new hotel instance in the database.                |
| instance_from_db() | Converts a database row to a Hotel object.                   |
| get_all()          | Retrieves all hotel instances from the database.             |
| find_by_id()       | Finds a hotel instance by its ID.                            |
| find_by_name()     | Finds a hotel instance by its name.                          |
| save()             | Saves changes to an existing hotel instance in the database. |
| update()           | Updates an existing hotel instance in the database.          |
| delete()           | Deletes a hotel instance from the database.                  |


**Functionality and Interactivity:**
With the foundation of our ORM-based models in place, we can implement a wide range of functionalities to enhance interactivity and usability. From simple CRUD (Create, Read, Update, Delete) operations to more complex data querying and manipulation tasks, our Python CLI application provides users with a versatile toolkit for managing their database records effectively. The following are Hotel and Guest commands that will act as our backend methods. 

Hotel Commands: 

| Command                  | Description                                                |
|--------------------------|------------------------------------------------------------|
| create_hotel()           | Create a new hotel.                                        |
| update_hotel()           | Update an existing hotel.                                  |
| delete_hotel()           | Delete a hotel by ID.                                      |
| display_all_hotels()     | Display all hotels.                                        |
| search_hotel_by_name()   | Search for a hotel by name via fuzzy search.               |
| search_hotel_by_id()     | Search for a hotel by ID.                                  |


Guest Commands:

| Command                          | Description                                               |
|----------------------------------|-----------------------------------------------------------|
| create_guest()                   | Create a new guest.                                       |
| update_guest()                   | Update an existing guest.                                 |
| delete_guest()                   | Delete a guest by ID.                                     |
| display_all_guests()             | Display all guests.                                       |
| search_for_guest_by_id()         | Search for a guest by ID.                                 |
| search_for_guest_by_name()       | Search for a guest by name via fuzzy search.              |
| search_for_guests_from_one_hotel() | Display all guests for a single hotel.                   |
| search_for_guests_by_name_length() | Display all guests whose name length is equal to or less than a specified length. |


**CLI Interaction with Click:**
The Click library serves as the backbone of our command-line interface, offering a simple and intuitive way to define commands and options. Through the use of Click decorators such as @click.group(), @click.command(), and @click.option(), we can create a cohesive CLI experience that guides users through various database operations with minimal effort. Feel free to look through the documentation for this library [here](https://click.palletsprojects.com/en/8.1.x/)

**App Entry Point:**
The app.py file serves as the entry point to our Python CLI application, organizing and centralizing all interaction commands in a modular and maintainable manner. By encapsulating each command within a dedicated function and leveraging Click's command grouping capabilities, we create a cohesive and user-friendly CLI interface that is easy to navigate and understand.

**Testing with Pytest:**
Testing is an integral part of software development, and our Python CLI application is no exception. With Pytest, we can write comprehensive test cases to validate the functionality of our ORM models, CLI commands, and other application components. I have implemented tests solely for the ORM models and properties set within these models. I will continue to add tests for the cli calls to the menu and asserting the database contains the entries based on the action committed.

**Conclusion:**
In conclusion, Python CLI applications offer a powerful and versatile solution for simplifying database interaction. By leveraging ORM frameworks, models, and libraries like Click, developers can build CLI applications that streamline database management tasks and empower users to interact with their data more effectively. Whether you're a seasoned developer or a database novice, Python CLI applications provide a user-friendly and accessible platform for database interaction, making database management a breeze.