Building Data-Driven Web Apps with Pyramid and SQLAlchemy Transcripts
Chapter: Using SQLAchemy
Lecture: Package details data
0:00 We have our design in place
0:01 but we don't really have the data being passed.
0:03 Let's go fix that, so if we go over to our controller
0:07 here we're just passing package name.
0:09 But we actually have to pass a whole bunch of other stuff.
0:11 So let's start by treating this for real
0:15 and let's go over here and say package.
0:17 It's going to be package_service, and find_package_by_name.
0:24 Alright well that doesn't exist, does it?
0:26 So PyCharm can write it for us, thank you.
0:28 And this is going to be a str
0:30 and it's actually going to return an optional package.
0:35 Optional comes from the typing library.
0:37 Okay so, what are we going to do?
0:38 What we always do when talk the database. And then go here.
0:42 And we're create a session, and then we'll be able to return
0:45 some result of a query.
0:47 Turns out this is super easy, remember the package name is
0:50 also actually the ID and maybe want to strip off anything
0:56 like spaces, or make this lowercase
0:58 but we're just going to just do the query with it.
1:00 Assuming everything comes together, so we'll just say
1:03 give us a query of package, and then we're going to filter
1:07 on the package.id == to package_name.
1:13 What do we get if we do this?
1:14 Well we get one or zero packages of course
1:18 but what we actually get is a cursor into the database.
1:21 Cause, it has no way of knowing that that means just one
1:23 so if we want to make sure we get just the one we'll say first.
1:27 So first, or None if it doesn't exist.
1:30 Instead of returning like a query set thing
1:32 we're going to get actually either the first package
1:35 or nothing if the name doesn't match, hence the optional.
1:39 Okay so now instead of checking for this package name
1:43 we'll check to make sure the package is actually found.
1:46 So there's a few things we're going to have to put here
1:47 and it's going to be a little complicated
1:49 it's going to get more complicated before it gets better.
1:51 Okay, so go over here and pass the package
1:54 that's not needed anymore.
1:56 Now in order for this to actually work
1:58 we're going to have to, let me point at some pieces here
2:02 we're going to have to come and indicate whether
2:04 it's the latest version, and if it's not
2:06 which version it is here is the numerical value
2:09 of the latest version and whether or not
2:11 that numerical value is the latest, okay?
2:13 And by the way, if it turns out to not be the latest
2:16 we'll get a different install statement right there, okay?
2:21 So, for that we got to return the latest version.
2:27 Now this is the part where it gets messier
2:28 before it gets better.
2:29 I'm going to show you a way to vastly improve this
2:31 but it adds another layer on top of things.
2:34 So first of all let's just come up with the details here
2:37 and then we'll clean it up in another
2:38 section under validation.
2:40 So we'll save the latest version
2:42 we're going to default this to zero and we'll say
2:44 if package.releases, remember this?
2:47 Our releases' navigating that relationship.
2:50 Now, right now this is going back and doing
2:52 another database interaction
2:54 which is not terrible but it's not awesome.
2:56 We'll fix that in a minute.
2:57 So we'll say r equals, let's call this latest release
3:01 we need the latest version to be set to nothing.
3:05 An empty sort of nothing value or the real version
3:09 but we're also going to need, if that exists
3:11 there is a latest release we'll actually need that object.
3:13 So I'm going to say this is None.
3:16 I'm going to pass that in a second.
3:18 Alright so the package has releases
3:20 the latest release is going to be the first one, why?
3:25 We go over to the package class, notice we're sorting
3:29 descending by the highest version number.
3:32 Okay so it means the zeroth one is the latest release.
3:36 Have the latest version text is going to be
3:42 alright pass these along, it's kind of big.
3:44 So let's wrap it, and we're getting close.
3:46 We're also going to need to pass the maintainers
3:48 we haven't dealt with that yet.
3:49 So, I'm just going to pass that as an empty list
3:53 so it doesn't crash.
3:55 And the other thing we need to discuss is
3:57 is this the latest release?
3:58 And I'm just going to say it is for now
4:00 remember the ability to navigate to different versions.
4:02 We're just going to say is latest
4:05 is true, for the moment.
4:07 We don't actually take the versions here
4:10 under these details exactly but down here
4:14 when we look at the released version.
4:17 Pull up the details, here we're passing that.
4:19 So we'll come back to that.
4:20 I think this might be enough, so what are we going to do?
4:22 Going to go to our super simple query
4:25 make sure we got something back.
4:26 If we didn't, must not be found.
4:30 Come up with the various data here's a little default.
4:32 If we actually do have releases we'll put those here.
4:35 I'm going to return these values.
4:37 So one more thing we'll need
4:38 when we get the more complicated bit
4:41 but we're just going to say that our current version
4:42 we have out there is this, is the latest version.
4:47 Oh, look at that.
4:48 Alright let's do quick comparison.
4:51 Real, fake, real, fake.
4:56 Looks like our, oh our fonts maybe are not the most amazing
5:00 here we might not be bringing those in.
5:01 But nonetheless, it's close enough for what we're doing.
5:05 And notice here's our description
5:06 right, if we could transform this restructured text
5:09 that would be better, but it's not.
5:11 Here's our project description, our release history.
5:14 I think we might need to put a wrap there.
5:18 Got the home page.
5:19 Here's the awscli, here's information on the status
5:23 here's the license, here's the license again.
5:25 Here's all the extra metadata.
5:27 So it's looking pretty good, and here our latest version.
5:31 Well, it's good, it is the latest version.
5:33 We're also missing a little CSS, hold on I'll fix that.
5:39 There we go, now we got that wrapping and everything.
5:42 Looks a little bit better
5:43 I just forgot to move a little CSS over.
5:45 Like I said, we're skipping over the design.
5:47 It's very very similar to before
5:48 but just needed a few more styles.
5:51 Alright what do you think?
5:52 Pretty close, again it's not exact
5:54 like we don't actually have the copy feature
5:55 but I think it's close enough for
5:58 our little demo app that we're building.
6:00 Here's the summary that was entered in the database.
6:02 Here's the package ID, here's the latest release.
6:06 Here's the date of the latest release
6:08 that's those kind of are why we actually needed the object.
6:11 And yeah, everything looks really good.
6:14 So I think that's pretty much working.
6:16 Let's just review it real quick here.
6:18 In order to do this, all we had to throw in a filter
6:21 and say package.field or column ==.
6:25 I know Django and Mongoengine have equals here
6:28 but in SQLAlchemy, you put the equality statement here.
6:32 So you can do greater than and stuff as well.
6:34 So ID equal equal the value
6:37 and then to get just one of them first.
6:40 And the rest was just passing the data off to the template.