-
Notifications
You must be signed in to change notification settings - Fork 0
/
homework_sqlalchemy_2.py
138 lines (105 loc) · 5 KB
/
homework_sqlalchemy_2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float, or_, and_
from sqlalchemy.orm import sessionmaker
import requests
"""ACCESSING A TABLE"""
engine = create_engine('sqlite:///homework_sql.db', echo=True)
Base = declarative_base()
class Books(Base):
"""TURNING A DATABASE INTO AN OBJECT"""
__tablename__ = 'Books'
books_id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
author = Column(String)
publisher = Column(String)
description = Column(String, nullable=False)
edition = Column(Integer)
year = Column(Integer, nullable=False)
quantity = Column(Integer, nullable=False)
price = Column(Float)
def __repr__(self) -> str:
# return f'{self.books_id}, {self.title}, {self.author}, {self.publisher}, {self.description}, {self.edition}, {self.year}, {self.quantity}, {self.price}' # list
return f'({self.books_id}, {self.title}, {self.author}, {self.publisher}, {self.description}, {self.edition}, {self.year}, {self.quantity}, {self.price})' # tuple list
"""CREATING A TABLE"""
# Books.__table__.create(engine)
""" FILTERING A COLUMN """
def one(session):
""" 1. Title and Description of all books written by “J.K. Rowling” """
results = session.query(Books.title, Books.author).filter_by(
author='J.K. Rowling').all()
print(results)
def two(session):
""" 2. Title, Publisher and Edition of all books printed last decade (in the 2010s) """
results = session.query(Books.title, Books.publisher,
Books.edition, Books.year).filter(Books.year >= 2010).all()
print(results)
def three(session):
""" 3. All information about books that are not in stock """
results = session.query(Books).filter_by(quantity=0).all()
print(results)
def four(session):
""" 4. All books in stock without a price """
results = session.query(Books).filter(Books.price == 0).all()
print(results)
def five(session):
""" 5. All books containing the word “Cooking” or “Food”, in stock that were written by either “Gordon Ramsay” or “Jamie Oliver” """
results = session.query(Books.title, Books.author).filter(and_(Books.quantity != 0, or_(Books.title.like(
'%Cooking%'), Books.title.like('%Food%'), (Books.author == 'Gordon Ramsay'), (Books.author == 'Jamie Oliver')))).all()
print(results)
def six(session):
""" 6. All authors whose name starts with a vowel """
results = session.query(Books.author).filter(or_(
Books.author.like('a%'), Books.author.like('e%'), Books.author.like('i%'), Books.author.like('o%'), Books.author.like('u%'))).all()
print(results)
def seven(session):
""" 7. All book titles that have the letter “a” at least 3 times in. """
results = session.query(Books.title).filter(
Books.title.like('%a%a%a%')).all()
print(results)
def eight(session):
""" 8. Book titles composed of exactly 4 characters. """
results = session.query(Books.title).filter(
Books.title.like('____')).all()
print(results)
def nine(session):
""" 9. Books with the title same as the name of the author """
results = session.query(Books.title, Books.author).filter(
Books.title == Books.author).all()
print(results)
def ten(session):
""" 10. Books in stock, written by an author whose name does not end with the letter a, with a description that is either empty or has at least 5 characters """
results = session.query(Books).filter(Books.author.notlike(
'%a') & (Books.quantity > 0) & ((Books.description == "") | (Books.description.like('_____%')))).all() # can also use '&' as AND (and_) OPERATOR and '|' as OR (or_) OPERATOR
for result in results:
print(result)
def inserting_books(session):
requested_books = requests.get(
"https://www.googleapis.com/books/v1/volumes?q=+inauthor:rowling&printType=books")
books = requested_books.json()
book_id = int(session.query(Books.books_id).order_by(
Books.books_id.desc()).first()[0]) + 1
for each in books['items']:
"""INSERTING INTO TABLE"""
books = Books(books_id=book_id, title=each['volumeInfo']['title'], author=each['volumeInfo']['authors'][0], publisher="Penguin House", description=str(each['volumeInfo']['description']), edition=1,
year=int(each['volumeInfo']['publishedDate'][0:4]), quantity=10, price=(each['saleInfo'].get('retailPrice', {})).get('amount', 0.0))
book_id += 1
session.add(books)
session.commit()
if __name__ == "__main__":
"""STARTING A SESSION"""
Session = sessionmaker(bind=engine)
session = Session()
# one(session)
# two(session)
# three(session)
# four(session)
# five(session)
# six(session)
# seven(session)
# eight(session)
# nine(session)
# ten(session)
book_id = list(session.query(Books.books_id).order_by(
Books.books_id.desc()).limit(1)[0])
print(book_id)