[ Data Modeling, Flask-SQLAlchemy and Plugins ]

I working on a website based on Flask and Flask-SQLAlchemy with MySQL. I have a handful bunch of feeds, each feed has a few data, but it needs a function.

At first, I used MySQL-python (with raw SQL) to store data, and feeds were on plugins system so each feed overrides update() function to import data by its way.

Now I changed to use Flask-SQLAlchemy and added Feed model to the database as it helps with SQLAlchemy ORM, but I'm stuck at how to handle update() function?

  1. Keep the plugins system in parallel with the database model, but I think that's unpractical/noneffective.
  2. Extend model class, I'm not sure if that's possible, e.g. FeedOne(Feed) will represent item(name="one") only.
  3. Make update() function handle all feeds, by using if self.name == "" statement.

Added some code bits.

Feed model:

class Feed(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255))
    datapieces = db.relationship('Datapiece', backref = 'feed', lazy = 'dynamic')

update() function

def update(self):
    data = parsedata(self.data_source)

    for item in data.items:
        new_datapiece = Datapiece(feed=self.id, name=item.name, value=item.value)
        db.session.add(new_datapiece)

    db.session.commit()

What I hope to achieve in option 2 is:

for feed in Feed.query.all():
    feed.update()

And every feed will use its own class update().

Answer 1


Extending the class and adding an .update() method is just how it is supposed to work for option 2. I don't see any problem in it (and i'm using that style of coding with flask/sqlalchemy all the time).

And if you (can) omit the dynamic lazy attribute you could also do a thing like:

self.datapieces.append(new_datapiece)

in your Feed's update function.