【问题标题】:Data Modeling, Flask-SQLAlchemy and Plugins数据建模、Flask-SQLAlchemy 和插件
【发布时间】:2023-03-11 13:42:01
【问题描述】:

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

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

现在我改为使用 Flask-SQLAlchemy 并将 Feed 模型添加到数据库中,因为它有助于 SQLAlchemy ORM,但我不知道如何处理 update() 函数?

  1. 保持插件系统与数据库模型并行,但我认为这不切实际/无效。
  2. 扩展模型类,我不确定这是否可能,例如FeedOne(Feed) 将仅代表 item(name="one")。
  3. 使用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()

【问题讨论】:

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

标签: python plugins sqlalchemy flask flask-sqlalchemy


【解决方案1】:

扩展类并添加 .update() 方法正是它应该适用于选项 2 的方式。 我没有看到任何问题(而且我一直在使用flask/sqlalchemy 的这种编码风格)。

如果您(可以)省略动态惰性属性,您还可以执行以下操作:

self.datapieces.append(new_datapiece)

在您的 Feed 的更新功能中。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2015-03-25
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多