Python 数据建模、炼金术和插件

Python 数据建模、炼金术和插件,python,plugins,sqlalchemy,flask,flask-sqlalchemy,Python,Plugins,Sqlalchemy,Flask,Flask Sqlalchemy,我在一个基于Flask和Flask SQLAlchemy与MySQL的网站上工作。我有一些feed,每个feed都有一些数据,但它需要一个函数 起初,我使用MySQL-python(带有原始SQL)来存储数据,feed在插件系统上,因此每个feed都覆盖update()函数,以自己的方式导入数据 现在我改为使用Flask SQLAlchemy,并向数据库中添加了提要模型,因为它有助于SQLAlchemy ORM,但我一直在研究如何处理update()函数 保持插件系统与数据库模型并行,但我认为这

我在一个基于Flask和Flask SQLAlchemy与MySQL的网站上工作。我有一些feed,每个feed都有一些数据,但它需要一个函数

起初,我使用MySQL-python(带有原始SQL)来存储数据,feed在插件系统上,因此每个feed都覆盖update()函数,以自己的方式导入数据

现在我改为使用Flask SQLAlchemy,并向数据库中添加了提要模型,因为它有助于SQLAlchemy ORM,但我一直在研究如何处理
update()
函数

  • 保持插件系统与数据库模型并行,但我认为这是不实际/无效的
  • 扩展模型类,我不确定这是否可行,例如FeedOne(Feed)将仅表示项(name=“one”)
  • 使用
    if self.name==“”
    语句,使
    update()函数处理所有提要
  • 添加了一些代码位

    馈送模式:

    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()
    函数

    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()
    
    我希望在方案2中实现的目标是:

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

    每个提要都将使用自己的类
    update()

    扩展类并添加.update()方法,这正是选项2的工作方式。 我看不出有任何问题(我一直在使用flask/sqlalchemy的这种编码风格)

    如果您(可以)省略dynamic lazy属性,您还可以执行以下操作:

    self.datapieces.append(new_datapiece)
    

    在你的订阅源的更新功能中。

    你能分享一些代码吗,这样我们就可以更好地了解你的
    Feed
    模型和
    update()
    方法了?@Audrius我在问题中添加了代码位。你到底想要什么还不清楚。但是,如果您试图更新数据库中的现有记录,请不要重新创建它。查询数据库,然后操作结果对象的属性,然后
    commit()
    。另一件让我困惑的事情是你的
    update()
    方法在哪里。这是你模型的一部分吗?@Cfreak我已经这么做了,我发布的代码只是一个简短的示例,谢谢你的建议。现在关于
    update()
    ,在我现在使用的选项1中,
    update()
    驻留在插拔系统中,每个提要都有自己的插件覆盖
    update()
    ,问题是我不喜欢同时插拔系统和数据库表,因为它们没有紧密连接。我更新了问题,添加了第三个选项和选项2的示例。