From 369fe30e3026acc435b3a47a85f538c7319672d1 Mon Sep 17 00:00:00 2001 From: "Abraham O. OLAGUNJU" <36889745+OluwaninsolaAO@users.noreply.github.com> Date: Mon, 24 Apr 2023 10:07:57 +0100 Subject: [PATCH] Task 07 --- models/engine/db_storage.py | 109 ++++++++++++++++---------------- models/engine/db_storage.py.old | 83 ------------------------ 2 files changed, 53 insertions(+), 139 deletions(-) delete mode 100755 models/engine/db_storage.py.old diff --git a/models/engine/db_storage.py b/models/engine/db_storage.py index 02971ab708e8..c8feba5d28a8 100755 --- a/models/engine/db_storage.py +++ b/models/engine/db_storage.py @@ -1,86 +1,83 @@ #!/usr/bin/python3 -"""This module defines a class to manage db storage for hbnb clone""" +"""Defines a new engine that uses SQLAlchemy""" +import os from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session -from ..base_model import Base, BaseModel -from os import getenv -from sqlalchemy import create_engine, inspect - -HBNB_MYSQL_USER = getenv('HBNB_MYSQL_USER') -HBNB_MYSQL_PWD = getenv('HBNB_MYSQL_PWD') -HBNB_MYSQL_HOST = getenv('HBNB_MYSQL_HOST') -HBNB_MYSQL_DB = getenv('HBNB_MYSQL_DB') -HBNB_MYSQL_PORT = getenv('HBNB_MYSQL_PORT') -HBNB_ENV = 'dev' class DBStorage: - """This class manages storage of hbnb . in database""" + """DBStorage Engine running on SQLAlchemy""" + __engine = None __session = None def __init__(self): - """initializes the database""" - self.__engine = create_engine('mysql+mysqldb://{}:{}@{}/{}' - .format(HBNB_MYSQL_USER, HBNB_MYSQL_PWD, - HBNB_MYSQL_HOST, HBNB_MYSQL_DB), - pool_pre_ping=True) - if HBNB_ENV == 'test': + """class constructor for DBStorage""" + + credentials = ['HBNB_MYSQL_USER', 'HBNB_MYSQL_PWD', + 'HBNB_MYSQL_HOST', 'HBNB_MYSQL_DB'] + env = [os.environ.get(c) for c in credentials] + e = 'mysql+mysqldb://{}:{}@{}/{}'.format(*env[:]) + self.__engine = create_engine(e, pool_pre_ping=True) + # Session = sessionmaker(bind=self.__engine) + # self.__session = Session() + + # drop all tables if the environment variable + # HBNB_ENV is equal to test + if os.environ.get('HBNB_ENV') == 'test': + from models.base_model import Base Base.metadata.drop_all(self.__engine) def all(self, cls=None): - """Returns a dictionary of all instances of a given class""" - from ..user import User - from ..state import State - from ..city import City - from ..place import Place - from ..review import Review - from ..amenity import Amenity + """Queries the current database session (self.__session) + for all objects depending of the class name (argument cls)""" + from models.user import User + from models.state import State + from models.city import City + from models.amenity import Amenity + from models.place import Place + from models.review import Review - result_dict = {} - for model in [User, State, City, Place, Amenity, Review]: - if cls is not None and model != cls: - continue - query_results = self.__session.query(model).all() - for obj in query_results: - key = "{}.{}".format(type(obj).__name__, obj.id) - result_dict[key] = obj - return result_dict + class_list = [State, City, User, Place, Review, Amenity] + objs = {} + if cls is not None: + for obj in self.__session.query(cls).all(): + objs.update({obj.to_dict()['__class__'] + '.' + obj.id: obj}) + else: + for class_item in class_list: + for obj in self.__session.query(class_item).all(): + key = obj.to_dict()['__class__'] + '.' + obj.id + objs.update({key: obj}) + return objs def new(self, obj): - """Adds new object to storage dictionary""" - if obj: - try: - self.__session.add(obj) - self.__session.flush() - self.__session.refresh(obj) - except Exception: - self.__session.rollback() + """Add obj to the current database session""" + self.__session.add(obj) def save(self): - """Saves storage dictionary to file""" + """Commit all changes of the current database session""" self.__session.commit() def delete(self, obj=None): - """delete obj from __objects if it’s inside""" + """Delete from the current database session obj if not None""" if obj is not None: self.__session.delete(obj) def reload(self): - """Loads storage dictionary from file""" - from ..user import User - from ..state import State - from ..city import City - from ..place import Place - from ..review import Review - from ..amenity import Amenity + """Create all tables in the database + """ + from models.user import User + from models.state import State + from models.city import City + from models.amenity import Amenity + from models.place import Place + from models.review import Review + from models.base_model import Base Base.metadata.create_all(self.__engine) - session_factory = sessionmaker( - bind=self.__engine, expire_on_commit=False) - self.__session = scoped_session(session_factory)() + Session = sessionmaker(bind=self.__engine, expire_on_commit=False) + self.__session = scoped_session(Session) def close(self): - """calls remove() method on the private - session attribute (self.__session)""" + """call close() method for commiting objects to db""" self.__session.close() diff --git a/models/engine/db_storage.py.old b/models/engine/db_storage.py.old deleted file mode 100755 index c8feba5d28a8..000000000000 --- a/models/engine/db_storage.py.old +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/python3 -"""Defines a new engine that uses SQLAlchemy""" -import os -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, scoped_session - - -class DBStorage: - """DBStorage Engine running on SQLAlchemy""" - - __engine = None - __session = None - - def __init__(self): - """class constructor for DBStorage""" - - credentials = ['HBNB_MYSQL_USER', 'HBNB_MYSQL_PWD', - 'HBNB_MYSQL_HOST', 'HBNB_MYSQL_DB'] - env = [os.environ.get(c) for c in credentials] - e = 'mysql+mysqldb://{}:{}@{}/{}'.format(*env[:]) - self.__engine = create_engine(e, pool_pre_ping=True) - # Session = sessionmaker(bind=self.__engine) - # self.__session = Session() - - # drop all tables if the environment variable - # HBNB_ENV is equal to test - if os.environ.get('HBNB_ENV') == 'test': - from models.base_model import Base - Base.metadata.drop_all(self.__engine) - - def all(self, cls=None): - """Queries the current database session (self.__session) - for all objects depending of the class name (argument cls)""" - from models.user import User - from models.state import State - from models.city import City - from models.amenity import Amenity - from models.place import Place - from models.review import Review - - class_list = [State, City, User, Place, Review, Amenity] - objs = {} - if cls is not None: - for obj in self.__session.query(cls).all(): - objs.update({obj.to_dict()['__class__'] + '.' + obj.id: obj}) - else: - for class_item in class_list: - for obj in self.__session.query(class_item).all(): - key = obj.to_dict()['__class__'] + '.' + obj.id - objs.update({key: obj}) - return objs - - def new(self, obj): - """Add obj to the current database session""" - self.__session.add(obj) - - def save(self): - """Commit all changes of the current database session""" - self.__session.commit() - - def delete(self, obj=None): - """Delete from the current database session obj if not None""" - if obj is not None: - self.__session.delete(obj) - - def reload(self): - """Create all tables in the database - """ - from models.user import User - from models.state import State - from models.city import City - from models.amenity import Amenity - from models.place import Place - from models.review import Review - from models.base_model import Base - - Base.metadata.create_all(self.__engine) - Session = sessionmaker(bind=self.__engine, expire_on_commit=False) - self.__session = scoped_session(Session) - - def close(self): - """call close() method for commiting objects to db""" - self.__session.close()