CRUD Operations in Gaelyk would involve:
- Create an entity
- Read an entity
- Update an entity
- Delete an entity
In this article we will look at creating an entity in the datastore.
Create of CRUD operations
The data in BigTable is held in Entity where each entity has some fields, associated types and values for each field. It also adds a Key to each data row in the entity.
We will look at the details of the datastore as we proceed further, but lets setup the Gaelyk project first. The easiest way is to download the template project from here and extract it to some directory. Lets call this directory as PROJECT_HOME. One can run the command gradlew gaeRun to deploy the template project into the embedded Jetty server and access it from http://localhost:8080/.
In this series of articles we would be focused on a Book entity which has the following fields: isbn, title, authors, publisher, number of pages. To create an entity and store in the database we need to create a form for data entry, let go ahead and create a newBook.gtpl in PROJECT_HOME/src/main/webapp/WEB-INF/pages folder:
//newBook.gtpl <% include '/WEB-INF/includes/header.gtpl' %> <form action="/book" method="POST"> <div class="row"> <div class="span5"> <label for="isbn"/>ISBN</label> <input id="isbn" type="text" name="isbn"/> <label for="title"/>Title</label> <input id="title" type="text" name="title"/> <label for="authors"/>Author(s)</label> <input id="authors" type="text" name="authors"/> <label for="publisher"/>Publisher</label> <input id="publisher" type="text" name="publisher"/> <label for="numberOfPages"/>Number of Pages</label> <input id="numberOfPages" type="text" name="numberOfPages"/> </div> </div> <div class="row"> <div class="span4"> <input type="submit" value="Save"> <input type="reset" value="Reset"> </div> </div> </form> <% include '/WEB-INF/includes/footer.gtpl' %>
The template project uses bootstrap and therefor the styling aspects would be taken care! Now that we have a form to enter the data, we would need to setup up the route to access this page, that way we will have clean urls and not ending with .gtpl or .groovy and so on. The routes.groovy file handles all the routing information and is present in PROJECT_HOME/src/main/webapp/WEB-INF folder. Lets add the following entry to the routes.groovy file
//routes.groovy get "/book/new", forward: "/WEB-INF/pages/newBook.gtpl"
the above code says that when there is a GET request for ‘/book/new’, forward the request to the newBook.gtpl which renders the html markup for the page. On running the application locally using gradlew gaeRun and navigating to http://localhost:8080/book/new you should be able to see your page as something like:
Wait! we havent still configured the routes for Save operations, lets go ahead of do that. Lets create a groovy script addBook.groovy in the PROJECT_HOME/src/main/webapp/WEB-INF/groovy folder where all the groovy scripts(groovlets) are to be added.
//addBook.groovy import com.google.appengine.api.datastore.Entity def entity = new Entity("book") entity << params entity.save() request.operation = "saved" request.savedTitle = params.title forward '/WEB-INF/pages/success.gtpl'
params is a map which contains the data submitted by the form as key-value pairs. One can inspect the data by logging params.isbn or params.title or any of the params.fieldName data on to the console. Just in case someone wants to try use log.info params.title in the above groovy script.
entity << params entity.save()
the above code appends the key-value pairs in the params object to the entity object we have created and then save the contents on the entity object to the datastore. After saving the entity we forward to another page- success.gtpl which is created in PROJECT_HOME/src/main/webapp/WEB-INF/pages folder.
//success.gtpl <% include '/WEB-INF/includes/header.gtpl' %> <div class="row"> <p>Successfully <%= request.operation %> the book <%= request.savedTitle %></p> <p><a href="/book/new">Add another book</a></p> </div> <% include '/WEB-INF/includes/footer.gtpl' %>
We are yet to setup the route information for the groovy script we created to add the books. So go back to routes.groovy and add the following to the routes.groovy
//routes.groovy post "/book", forward: "/addBook.groovy"
which says, that any POST requests for /book should be forwarded to addBook.groovy script/groovlet. So save all the files and reload the URL http://localhost:8080/book/new and add some entries to the form and click on “Save” button and you should be able to see the “success” page.
Google App Engine provides a way to access the entities/data stored in the datastores by navigating to: http://localhost:8080/_ah/admin/datastore.
In the next article lets see how we can list all the entities we have stored in the datastore.