Building Data-Driven Web Apps with Flask and SQLAlchemy Transcripts
Chapter: MongoDB edition
Lecture: Concepts: MongoEngine and MongoDB
Login or purchase this course to watch this video and the rest of the course contents.
0:00 Let's close out this chapter by reviewing some of the concepts that we discussed while going through our conversion from SQLAlchemy to MongoDB.
0:08 First thing, we have to register connections so pretty straightforward, we just pass an alias and a name for the database and off it goes.
0:16 So here we said core and PyPI demo and we call mongoengine.register_connection. As long as our entities use the same alias which is called db_alias
0:26 in their little meta data thing as long as they use the same one it just uses this connection, it's this ambient
0:31 way to get to the database so you don't have to go through that session stuff. The classes that we map to the database
0:38 derive from a built in base class, mongoengine.Document. Everything that's going to be saved to a top level collection is a mongoengine.Document.
0:47 Here we have a package, in this one we're changing what the id is, like we did we used a string instead of an auto incrementing id.
0:55 If we want to take a bson, auto generate a bson id we could just omit that line but this one we want to make sure it's a string
1:02 which is that unique, I guess we don't say unique here we should say unique but that's a feature but it's not one that we set.
1:09 Anyway we want to make sure this is a unique thing and that is just the name of the package and we have datetime fields, string field and so on
1:17 pretty straightforward. What's really powerful though is that we don't have to limit ourselves to just tabular data.
1:24 We can have things like name, summary and homepage that would be tabular but then we can embed stuff. Normally in a relational database
1:31 this takes other tables to manage these many to many relationships. Here we just have maintainers and we're just embedding a list of items.
1:38 If we look at the record in the database it looks like this, we have our id the date, the summary and then we have a bunch
1:46 of maintainers that were put in there. And this is just the id, this is like a relationship back to the user table because it's many to many.
1:52 We're not embedding users in here right but we can avoid that maintainers table that is the normalization table. If we want to do a simple query
2:00 so easy, just package.objects column equals value for direct equal and then you want one you say first, if you want to do all of 'em
2:07 you just iterate over it or you say .all(). Things like that. So we're going to filter on one or more of the fields.
2:14 If you want to filter on more than one and do an and and just comma separate them like any keyword arguments. So in this case the id must match
2:20 the name of the past package name like requests or SQLAlchemy. We call first and this actually triggers the execution of the query.
2:29 If we didn't call that we'd have to loop over it or something, until then we could keep adding to it. And now it's going to return either one or none.
2:37 Let's imagine a world that we haven't been working in yet That's a little bit more complicated. We're doing a hotel or an Airbnb or something
2:45 and we have hotel rooms, those rooms have bookings and the bookings store which guests are in them.
2:52 So we have a booking object, it has an embedded object called guest, that embedded guest object has an id, if we want to answer
3:00 the question of show me all of the bookings for a given user or a given owner we come through and say, go find that owner
3:07 it would do a simple query to get them and then I can go to the room and say go to the room's bookings, this double underscore
3:15 right there says navigate the hierarchy. We have bookings, this is a list of guests or something like that or an embedded singular object
3:24 called guests and it has a guest id. So we're going into the bookings list or embedded item, say go to the guest id
3:32 and then we want to do an inquiry which is a list of ids. So show me the guest, find me all the bookings who have a guest who is contained
3:39 within the owner's family ids. Pretty awesome that we can do this and the way you do it is the double underscores
3:45 both navigate hierarchies and they apply operators like in, so double underscore in that's the operator that's being applied in the query.
3:53 Now one of the patterns that I like to use is make sure there's no data access outside this function. We could return a prepared query
4:03 that's not actually executed and then if we run into an error that error might happen in a view model, even maybe in a template.
4:09 So my best practice for you is to make sure all the data access is done by the time you leave this function, in this case
4:16 a real easy way to do that is convert this to an in-memory list, that means the whole thing is accosted and we're not using
4:22 data access anymore, we're just now working in memory.