Skip to content

Commit 970e68a

Browse files
committed
Query posts.
1 parent fa4f3fe commit 970e68a

File tree

4 files changed

+110
-44
lines changed

4 files changed

+110
-44
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from database import session
22
from sqlalchemy_tutorial.part3_relationships.models import Comment, Post, User
33

4-
from .joins import list_all_comments
4+
from .joins import get_all_comments, get_all_posts
55
from .objects import create_comment_objects, create_post_object, create_user_objects
6-
from .orm import create_comment, create_new_user, create_post
6+
from .orm import create_comment, create_user, create_post
77

88

99
def create_relationships():
@@ -14,22 +14,30 @@ def create_relationships():
1414
"""
1515
# Create admin & regular user
1616
admin_user, regular_user = create_user_objects()
17-
admin_user = create_new_user(session, admin_user)
18-
regular_user = create_new_user(session, regular_user)
17+
admin_user = create_user(session, admin_user)
18+
regular_user = create_user(session, regular_user)
1919

2020
# Create post object and add to database
21-
post = create_post_object(admin_user)
22-
post = create_post(session, post, admin_user)
21+
post_1, post_2 = create_post_object(admin_user)
22+
post_1 = create_post(session, post_1)
23+
post_2 = create_post(session, post_2)
2324

24-
# Create three comments on the same post
25+
# Create comments on the same post
2526
(
2627
comment_1,
2728
comment_2,
2829
comment_3,
29-
) = create_comment_objects(regular_user, post)
30-
create_comment(session, regular_user, comment_1)
31-
create_comment(session, regular_user, comment_2)
32-
create_comment(session, regular_user, comment_3)
30+
comment_4,
31+
comment_5,
32+
) = create_comment_objects(regular_user, admin_user, post_1, post_2)
33+
create_comment(session, comment_1)
34+
create_comment(session, comment_2)
35+
create_comment(session, comment_3)
36+
create_comment(session, comment_4)
37+
create_comment(session, comment_5)
3338

34-
# Show post with comments:
35-
list_all_comments(session)
39+
# One-to-many JOIN for a given user
40+
get_all_posts(session, admin_user)
41+
42+
# Show posts with comments:
43+
get_all_comments(session)

sqlalchemy_tutorial/part3_relationships/joins.py

+37-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,45 @@
22
from sqlalchemy.orm import Session
33

44
from logger import LOGGER
5-
from sqlalchemy_tutorial.part3_relationships.models import Comment, Post
5+
from sqlalchemy_tutorial.part3_relationships.models import Comment, Post, User
66

77

8-
def list_all_comments(session: Session):
8+
def get_all_posts(session: Session, admin_user: User):
9+
"""
10+
Fetch all posts belonging to an author user.
11+
12+
:param session: SQLAlchemy database session.
13+
:type session: Session
14+
:param admin_user: Author of blog posts.
15+
:type admin_user: User
16+
17+
:return: None
18+
"""
19+
posts = (
20+
session.query(Post)
21+
.join(User, Post.author_id == User.id)
22+
.filter_by(username=admin_user.username)
23+
.all()
24+
)
25+
for post in posts:
26+
post_record = {
27+
"post_id": post.id,
28+
"title": post.title,
29+
"summary": post.summary,
30+
"status": post.status,
31+
"feature_image": post.feature_image,
32+
"author": {
33+
"id": post.author_id,
34+
"username": post.author.username,
35+
"first_name": post.author.first_name,
36+
"last_name": post.author.last_name,
37+
"role": post.author.role,
38+
},
39+
}
40+
LOGGER.info(post_record)
41+
42+
43+
def get_all_comments(session: Session):
944
"""
1045
Fetch all comments and join with their parent posts.
1146

sqlalchemy_tutorial/part3_relationships/objects.py

+39-11
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def create_user_objects() -> Tuple[User, User]:
3232
return admin_user, regular_user
3333

3434

35-
def create_post_object(admin_user: User) -> Post:
35+
def create_post_object(admin_user: User) -> Tuple[Post, Post]:
3636
"""
3737
Set up post to add to database.
3838
@@ -41,7 +41,7 @@ def create_post_object(admin_user: User) -> Post:
4141
4242
:return: Post
4343
"""
44-
return Post(
44+
post_1 = Post(
4545
author_id=admin_user.id,
4646
slug="fake-post-slug",
4747
title="Fake Post Title",
@@ -52,24 +52,40 @@ def create_post_object(admin_user: User) -> Post:
5252
cheese gouda. Rubber cheese cheese and wine cheeseburger cheesy grin paneer paneer taleggio caerphilly. \
5353
Edam mozzarella.",
5454
)
55+
post_2 = Post(
56+
author_id=admin_user.id,
57+
slug="an-additional-post",
58+
title="Yet Another Post Title",
59+
status="published",
60+
summary="An in-depth exploration into writing your second blog post.",
61+
feature_image="https://hackersandslackers-cdn.storage.googleapis.com/2021/01/[email protected]",
62+
body="Smelly cheese cheese slices fromage. Pepper jack taleggio monterey jack cheeseburger pepper jack \
63+
swiss everyone loves. Cheeseburger say cheese brie fromage frais swiss when the cheese comes out \
64+
everybody's happy babybel cheddar. Cheese and wine cheesy grin",
65+
)
66+
return post_1, post_2
5567

5668

5769
def create_comment_objects(
58-
regular_user: User, post: Post
59-
) -> Tuple[Comment, Comment, Comment]:
70+
regular_user: User, admin_user: User, post_1: Post, post_2: Post
71+
) -> Tuple[Comment, Comment, Comment, Comment, Comment]:
6072
"""
61-
Set up 3 comments to be added to published post.
73+
Set up comments to be added to published post.
6274
6375
:param regular_user: User to serve as comment author.
6476
:type regular_user: User
65-
:param post: Blog post to be created.
66-
:type post: Post
77+
:param admin_user: User to serve as post or comment author.
78+
:type admin_user: User
79+
:param post_1: First blog post to associate comments with.
80+
:type post_1: Post
81+
:param post_2: First blog post to associate comments with.
82+
:type post_2: Post
6783
6884
:return: Tuple[Comment, Comment, Comment]
6985
"""
7086
comment_1 = Comment(
7187
user_id=regular_user.id,
72-
post_id=post.id,
88+
post_id=post_1.id,
7389
body="This post about SQLAlchemy is awful. You didn't even bother to explain how to install Python, \
7490
which is where I (and so many others) got stuck. Plus, your code doesn't even work!! \
7591
I cloned your code and it keeps giving me `environment variable` errors... \
@@ -78,15 +94,27 @@ def create_comment_objects(
7894
)
7995
comment_2 = Comment(
8096
user_id=regular_user.id,
81-
post_id=post.id,
97+
post_id=post_1.id,
8298
body="By the way, you SUCK!!! I HATE you!!!! I have a project due tomorrow, how am I supposed to finish \
8399
if you won't do my job for me, you selfish prick?!?!",
84100
upvotes=5,
85101
)
86102
comment_3 = Comment(
87103
user_id=regular_user.id,
88-
post_id=post.id,
104+
post_id=post_2.id,
89105
body="YOU RUINED MY LIFE!!!!",
90106
upvotes=5,
91107
)
92-
return comment_1, comment_2, comment_3
108+
comment_4 = Comment(
109+
user_id=admin_user.id,
110+
post_id=post_1.id,
111+
body="Please stop bullying me :(",
112+
upvotes=11,
113+
)
114+
comment_5 = Comment(
115+
user_id=admin_user.id,
116+
post_id=post_2.id,
117+
body="I was just trying to help.",
118+
upvotes=514,
119+
)
120+
return comment_1, comment_2, comment_3, comment_4, comment_5

sqlalchemy_tutorial/part3_relationships/orm.py

+13-18
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from sqlalchemy_tutorial.part3_relationships.models import Comment, Post, User
99

1010

11-
def create_new_user(session: Session, user: User) -> User:
11+
def create_user(session: Session, user: User) -> User:
1212
"""
1313
Create a new user if username isn't already taken.
1414
@@ -20,13 +20,13 @@ def create_new_user(session: Session, user: User) -> User:
2020
:return: Optional[User]
2121
"""
2222
try:
23-
user_query = session.query(User).filter(User.username == user.username).first()
24-
if user_query is None:
23+
existing_user = session.query(User).filter(User.username == user.username).first()
24+
if existing_user is None:
2525
session.add(user) # Add the user
2626
session.commit() # Commit the change
2727
LOGGER.success(f"Created user: {user}")
2828
else:
29-
LOGGER.warning(f"Users already exists in database: {user_query}")
29+
LOGGER.warning(f"Users already exists in database: {existing_user}")
3030
return session.query(User).filter(User.username == user.username).first()
3131
except IntegrityError as e:
3232
LOGGER.error(e.orig)
@@ -36,31 +36,26 @@ def create_new_user(session: Session, user: User) -> User:
3636
raise e
3737

3838

39-
def create_post(session: Session, post: Post, admin_user: User) -> Post:
39+
def create_post(session: Session, post: Post) -> Post:
4040
"""
41-
Create a post authored by `admin_user`.
41+
Create a post.
4242
4343
:param session: SQLAlchemy database session.
4444
:type session: Session
4545
:param post: Blog post to be created.
4646
:type post: Post
47-
:param admin_user: User to serve as post or comment author.
48-
:type admin_user: User
4947
5048
:return: Post
5149
"""
5250
try:
53-
existing_post = (
54-
session.query(Post).filter(Post.author_id == admin_user.id).first()
55-
)
51+
existing_post = session.query(Post).filter(Post.slug == post.slug).first()
5652
if existing_post is None:
57-
post.author_id = admin_user.id
5853
session.add(post) # Add the post
5954
session.commit() # Commit the change
6055
LOGGER.success(
61-
f"Created post {post} published by user {admin_user.username}"
56+
f"Created post {post} published by user {post.author.username}"
6257
)
63-
return session.query(Post).filter(Post.author_id == admin_user.id).first()
58+
return session.query(Post).filter(Post.slug == post.slug).first()
6459
else:
6560
LOGGER.warning(f"Post already exists in database: {post}")
6661
return existing_post
@@ -72,14 +67,12 @@ def create_post(session: Session, post: Post, admin_user: User) -> Post:
7267
raise e
7368

7469

75-
def create_comment(session: Session, regular_user: User, comment: Comment) -> Comment:
70+
def create_comment(session: Session, comment: Comment) -> Comment:
7671
"""
7772
Create a comment posted by `regular_user` on `admin_user`'s post.
7873
7974
:param session: SQLAlchemy database session.
8075
:type session: Session
81-
:param regular_user: User to serve as comment author.
82-
:type regular_user: User
8376
:param comment: User comment left on published post.
8477
:type comment: Comment
8578
@@ -88,7 +81,9 @@ def create_comment(session: Session, regular_user: User, comment: Comment) -> Co
8881
try:
8982
session.add(comment) # Add the Comment
9083
session.commit() # Commit the change
91-
LOGGER.success(f"Created comment {comment} posted by user {regular_user}")
84+
LOGGER.success(
85+
f"Created comment {comment} posted by user {comment.user.username}"
86+
)
9287
return comment
9388
except IntegrityError as e:
9489
LOGGER.error(e.orig)

0 commit comments

Comments
 (0)