I came to a conclusion that the home page of this blog had posts that were much too long. I needed to change it so that it would only display X characters and then a show more button linking to the blog post. Below is a migration script I wrote showing just how easy it was to convert my old db values to new ones.
def convert_home_html_to_new_format():
home_post_body = """\
<div class="card">
<div class="card-content">
<div class="media">
<div class="media-content">
<p class="title is-4"><a href="https://blog.maxbridgland.com/blog/{direct_url}">{title}</a></p>
<p class="subtitle is-6">{upload_date} by {name}</p>
</div>
</div>
<div class="content">
<hr>
{content}
<center><a href="https://blog.maxbridgland.com/blog/{direct_url}">Show More</a></center>
</div>
</div>
</div>"""
all_keys = db.keys()
keys = []
for key in all_keys:
if len(key) < 5:
keys.append(key)
for key in keys:
obj = json.loads(bytes(db.get(key)).decode('utf-8'))
content = obj['content']
title = obj['title']
upload_date = obj['upload_date']
new_key = str(key).replace('b', '').replace("'", '')
obj['home_html'] = home_post_body.format(title=title, upload_date=upload_date, content=markdown(content[:120] + "......", extras=["fenced-code-blocks"]), name=app.config['name'], direct_url=new_key)
db.set(key, json.dumps(obj))
Let's go through and analyze what this function is doing. First I have a formatted HTML string that I will use to generate the card on my site. This HTML is updated compared to what we used to have. After that I pull all my keys from the db and grab all blog keys. I use len(key) < 5
to check that the key is not a long string like the keys I don't want in my db (one of the flaws I've found with Redis is that you can't have "collections" like in MongoDB). I iterate over those keys and append them to a new list with just the blog keys. Then I iterate over that and grab the value from the db. They are all json strings so i load those string with the json module into a Python object. I then modify this python object and reset the key in the database. Ez Pz Migration :)