diff --git a/diner.py b/diner.py index c0ad745f0d539da4ec00b956cd2a8734c160aa0c..b7aeefc1eb957a8fce67c3551b275abd7306adf7 100644 --- a/diner.py +++ b/diner.py @@ -1,6 +1,5 @@ from sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy.orm import declarative_base, sessionmaker, relationship # In Python, unlike many languages, it is possible to create new classes at @@ -8,13 +7,14 @@ from sqlalchemy.orm import sessionmaker, relationship # class that we can use for objects that we want SQLAlchemy to persist in a # database. We then store that class in variable named Persisted; effectively, # we make a new class called Persisted. -Persisted = declarative_base() # pylint: disable=invalid-name +Persisted = declarative_base() class Menu(Persisted): __tablename__ = 'menus' menu_id = Column(Integer, primary_key=True) # primary keys default to auto_increment name = Column(String(256), nullable=False) # nullable is the default + items = relationship('Item', uselist=True, back_populates='menu') class Item(Persisted): @@ -24,12 +24,15 @@ class Item(Persisted): menu_id = Column(Integer, ForeignKey('menus.menu_id', ondelete='CASCADE'), nullable=False) name = Column(String(256), nullable=False) price = Column(Integer, nullable=False) + menu = relationship('Menu', back_populates='items') + order_items = relationship('OrderItem', uselist=True, back_populates='item') class Order(Persisted): __tablename__ = 'orders' order_id = Column(Integer, primary_key=True) timestamp = Column(DateTime) + order_items = relationship('OrderItem', uselist=True, back_populates='order') class OrderItem(Persisted): @@ -37,6 +40,8 @@ class OrderItem(Persisted): order_id = Column(Integer, ForeignKey('orders.order_id', ondelete='CASCADE'), primary_key=True) item_id = Column(Integer, ForeignKey('items.item_id', ondelete='CASCADE'), primary_key=True) amount = Column(Integer) + item = relationship('Item', back_populates='order_items') + order = relationship('Order', back_populates='order_items') class DinerDatabase(object): diff --git a/diner_installer.py b/diner_installer.py index cbca8115e873b5e33e1f46a7befb0427243f300c..7e2b1ddf6e81337e904a72f41be87453d163ab43 100644 --- a/diner_installer.py +++ b/diner_installer.py @@ -1,3 +1,4 @@ +from datetime import datetime from sys import stderr from sqlalchemy.exc import SQLAlchemyError @@ -15,7 +16,7 @@ def add_starter_data(session): orange_juice = Item(menu=beverage_menu, name='Orange Juice', price=149) short_stack = Item(menu=food_menu, name='Pancakes', price=399) regular_pancakes = Item(menu=food_menu, name='Pancakes', price=499) - first_order = Order(order_items=[OrderItem(item=orange_juice, amount=2)]) + first_order = Order(order_items=[OrderItem(item=orange_juice, amount=2)], timestamp=datetime.now()) session.add(beverage_menu) session.add(food_menu) session.add(orange_juice) @@ -26,17 +27,17 @@ def add_starter_data(session): def main(): try: - url = DinerDatabase.construct_mysql_url('localhost', 3306, 'diner', 'root', 'cse1208') + url = DinerDatabase.construct_mysql_url('localhost', 3306, 'diner', 'root', 'mysqlpassword') diner_database = DinerDatabase(url) diner_database.ensure_tables_exist() print('Tables created.') - # session = diner_database.create_session() - # if already_has_data(session): - # print('Not creating records because some already exist.') - # else: - # add_starter_data(session) - # session.commit() - # print('Records created.') + session = diner_database.create_session() + if already_has_data(session): + print('Not creating records because some already exist.') + else: + add_starter_data(session) + session.commit() + print('Records created.') except SQLAlchemyError as exception: print('Database setup failed!', file=stderr) print(f'Cause: {exception}', file=stderr)