I'm starting to work on a system of checks to ensure the database is up to date. The way I see it, the checks will run on a fairly regular cron and generate 'issues' where Data doesn't line up.
Users will also have a way of generating 'issues' so there's a human element to checking the data integrity as well.
As it stands though, that would mean that I have to check a database table regularly. Surely it would be better to get an email or something every time there was a new entry in the database.
And as it turns out there's a pretty easy way to do that using SQLAlchemy and Flask.
Here's a truncated version of my models.py file:
from yvih import db from sqlalchemy import event from sqlalchemy.orm import mapper import smtplib class Data(db.Model): __tablename__ = 'data' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) email = db.Column(db.String) issue = db.Column(db.Text) member_id = db.Column(db.Integer, db.ForeignKey('members.id')) status = db.Column(db.Integer) def __init__(self, name, email, issue, member_id, status = 0): self.name = name self.email = email self.issue = issue self.member_id = member_id self.status = status def data_listener(mapper, connection, target): ''' send email to alert that new issue has been raised ''' message = """From: From Person To: To Person Subject: A new issue has been generated %s """ message = message % (target.issue) # @todo: send email from here event.listen(Data, 'after_insert', data_listener)
The first thing to note is the includes. 'Events' need to be includes from 'sqlalchemy' and 'mapper' from 'sqlalchemy.orm'.
Essentially events listen to mapped classes and execute a function when an event occurs on that class.
So in this case, I've set up a listener on the 'Data' class and am listening for the
after_insert event which then executes the
The event listener will pass three arguments to the listening function so make sure there are three variables passed to the function. The third argument is the data that is being saved so in the case, I can use it to email the issue.