Flask-SQLAlchemy:如何有条件地插入或更新行

2024-04-29

我的应用程序使用 Flask、Flask-SQLAlchemy、Flask-WTF 和 Jinja2 的组合。

在当前的版本中,我有一个设置表。该表只有一条记录和一个字段。最初该表包含零条记录。

我想要实现的是:

  • 鉴于数据库中不存在任何条目,则显示可供用户输入的空表单
  • 假设存在一个条目,则显示该条目,并且
  • 如果用户更改了该值,则更新 db 中的 rec。

这是我的代码:

模型.py

class Provider(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    rssfeed = db.Column(db.String(120), unique = True)

    def __init__(self, rssfeed):
        self.rssfeed = rssfeed

    def __repr__(self):
        return '<NZBMatrix feed url %r>' % self.rssfeed

forms.py

class SettingsForm(Form):
    rssfeed = TextField('rssfed', validators= [Required()])

views.py

    @app.route('/settings', methods=["GET","POST"])
    def settings():
    """ show settings """
        provider = Provider.query.get(1)
        form = SettingsForm(obj=provider)
        print provider

        if request.method == "POST" and form.validate():
            if Provider.query.get(1) is None:
                provider = Provider(rssfeed=form.rssfeed.data)
                form.populate_obj(provider)
                db.session.add(provider)
                db.session.commit()
                flash("Settings added")

        return render_template("settings.html", form=form)

就目前情况而言,如果记录不存在,则此代码会创建一条记录,但rssfeed列为空。

我怎样才能改变这个代码,以便它INSERT如果记录不存在并且UPDATE如果有的话?


一旦您的表格经过验证等,

要添加新记录:

new_provider = Provider(form.rssfeed.data)
db.session.add(new_provider)
db.session.commit()

要更新现有记录:

existing_provider = Provider.query.get(1) # or whatever
# update the rssfeed column
existing_provider.rssfeed = form.rssfeed.data
db.session.commit()

更新的技巧是您只需更改特定字段并进行提交。其余部分由数据库会话负责。我认为您正在使用 SQLAlchemy 中现已弃用的合并函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask-SQLAlchemy:如何有条件地插入或更新行 的相关文章

随机推荐

  • dev_t 和 ino_t 是否必须是整数类型?

    glibc 的文档保留它们是整数类型 不比 unsigned int 窄 但我没有找到说明它们必须是整数类型的标准参考 另请参阅 time t 所以最后 问题就变成了 include
  • 如何从与桌面交互的应用程序与 Windows 服务进行通信?

    使用 Net 与服务交互的最佳方式是什么 即大多数托盘应用程序如何与其服务器通信 如果这个方法也是跨平台的 那就更好了 在 Mono 中工作 所以我猜远程处理已经过时了 Edit 忘了说了 我们仍然需要在现场支持 Windows 2000
  • 非数字输入导致死循环

    由于某种原因 如果用户输入了错误的数据类型 例如 j 或 循环将停止要求输入并继续显示 Enter an integer gt 一遍又一遍 如何让程序处理错误的输入 为什么输入非数字值会导致如此奇怪的行为 define SENTINEL 0
  • 如何从 .NET DataGridView 控件单元格值写入文本文件?

    我有以下代码应该循环遍历我的所有行DataGridView 并将其所有单元格值写入文本文件 但是 它输出所有行 但仅输出每行的第一个单元格 而不输出其他三个单元格 string file name C test1 txt var objWr
  • 如何将svn文件夹上一级

    我需要将 svn 文件夹移至上一级并保留所有历史记录 所有文件和目录来自https myserver com svn Project trunk into https myserver svn Project 我使用一个命令 svn mov
  • 如何使用 jsdom 从 Service Worker(后台脚本)操作 chrome 扩展 V3 中的 DOM?

    我正在尝试在后台脚本中操作 HTML 字符串 该字符串在 chrome 扩展 V3 中使用服务工作人员 在迁移文档中提到使用 jsdom 来访问 DOMParser https developer chrome com docs exten
  • 设置 eclipse 进行 Windows 驱动程序开发

    我正在尝试使用 WDK 7 1 0 编写用户模式 Windows XP Vista 和 7 虚拟打印机驱动程序 我打算使用 eclipse IDE 进行开发 所以想知道是否可以进行相同的设置 我希望做以下事情 1 Eclipse 能够识别
  • GitLab CI语法来编写FOR循环语句?

    以下是 gitlab ci yml 文件中提到的脚本 此 GitLab CI 配置有效 但是 当运行 CI CD 构建时 作业会失败 与 FOR 循环语法有关吗 deploy dv stage deploy dv variables GIT
  • 返回数据集的 kSoap 和 .Net Web 服务

    我知道使用数据集是一个很大的罪恶 但由于该服务不在我的控制之下 并且创建代理服务的前景是不可能的 我想看看是否有人创建了可以使用 kSoap 序列化器反序列化的类结构 或者我是否吸错了东西 同时要启动它 看看是否可行 以下是预期的结果数据
  • 为什么“模型尚未加载”?

    我正在尝试使用 customUser 安装 django registration redux 我已将其包含在我的 settings py 中 AUTH USER MODEL app customUser 注册表位于目录 registrat
  • 使用 api php 使用通配符从 S3 中删除

    我有这个工作代码可以从 s3 中删除文件和文件夹 如何使用通配符 进行删除 s3 new AmazonS3 bucket mybucket folder myDirectory this doesnt work response s3 gt
  • 如何以编程方式滚动 Horizo​​ntalScrollView

    我有一个HorizontalScrollView其中包含一个RelativeLayout 该布局在 XML 中为空 并由 onCreate 中的 java 填充 我希望这个滚动视图最初位于中间的某个位置RelativeLayout 它比屏幕
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • PHP/regex:如何获取HTML标签的字符串值?

    我需要有关正则表达式的帮助或preg match http php net preg match因为我对这些还没有那么丰富的经验 所以这就是我的问题 我需要获取值 get me 但我认为我的函数有错误 html 标签的数量是动态的 它可以包
  • 将文件夹中结构化的预构建文件集添加到 android out 文件夹

    我为arm编译了glibc 这与Android glibc或bionic C不同 因为我编译的glibc环境将有助于提供更多api 现在我可以在 Android 运行时将 glibc 环境复制到 system 文件夹中 并且在执行 chro
  • git rebase 冲突是由哪个提交引起的

    当我执行 git rebase master 时 有时会发生冲突 有时 即使有错误消息 也很难追踪问题 如果我能找出 git 正在尝试重新申请并导致冲突的提交 这将是一个真正的帮助 如何找出哪个提交导致了冲突 查看冲突的文件 以开头的行 g
  • 如何在 C# 中获取包含表情符号的字符串的正确长度

    The 英语国旗表情符号 https emojipedia org flag for england 由 14 个字节的数据组成 组合后将呈现一个字符 如果我有如下所示的代码 var test ud83c udff4 udb40 udc67
  • 如何检查视频中任何 YouTube 视频上未发布的字幕

    我正在尝试构建一个自动化程序 如果视频上有草稿字幕 它会提醒我 最近有一些粗俗的字幕被添加到我的视频中 但被抓为草稿 我使用此示例作为基础 但当我尝试检查视频时 它仅提供已发布的视频字幕信息 我查看了 api 文档 看来我也应该看到处于草稿
  • 如何在 nltk 中使用 hunpos 标记文本文件?

    有人可以帮我解决在 nltk 中标记语料库的 hunpos 语法吗 我要导入什么hunpos HunPosTagger module http nltk googlecode com svn trunk doc api nltk tag h
  • Flask-SQLAlchemy:如何有条件地插入或更新行

    我的应用程序使用 Flask Flask SQLAlchemy Flask WTF 和 Jinja2 的组合 在当前的版本中 我有一个设置表 该表只有一条记录和一个字段 最初该表包含零条记录 我想要实现的是 鉴于数据库中不存在任何条目 则显