如何防止flask-sqlalchemy中的双重数据提交

Posted

技术标签:

【中文标题】如何防止flask-sqlalchemy中的双重数据提交【英文标题】:How to prevent double data submission in flask-sqlalchemy 【发布时间】:2013-04-30 09:51:10 【问题描述】:

我现在正在研究烧瓶和烧瓶-sqlalchemy 的主要概念。记住教程中的信息(intro 和contexts)我正在尝试创建一个简单的数据库。 我的 Flask 应用程序结构如下:

./db/
./db/models.py
./main.py

文件内容如下:

./main.py:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object(__name__)

from db.models import create_app

dbapp = create_app()
with dbapp.test_request_context():
  from db.models import db, mumsUsers
  db.create_all()
  db.session.rollback()
  admin = mumsUsers("admin", "admin@example.com")
  db.session.add(admin)
  db.session.commit()

./db/models.py:

from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask, current_app

db = SQLAlchemy()

def create_app():
  app = Flask(__name__)
  app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
  db.init_app(app)
  return(app)

class mumsUsers(db.Model):
  __tablename__ = 'mumsUsers'
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(80), unique=True)
  email = db.Column(db.String(80), unique=True)

  def __init__(self, username, email):
    self.username = username
    self.email = email

  def __repr__(self):
    return '<User %r>' % self.username

当我检查 sqlite 数据库时,我看到 sqlalchemy 正在尝试发送 commit() 两次。所以我必须删除 unique=True 参数以阻止应用程序崩溃。同时,当我从 python shell 运行以下命令时:

admin = mumsUsers('admin', 'admin@example.com')

db.session.add(admin)

db.session.commit()

只出现一条记录(正如预期的那样)。

因此我的问题是如何防止对 commit() 的双重调用?

更新 出现的问题是由我的错误引起的,同时进行循环导入。事实上,我没有注意到我为应用程序包调用了导入。 因此请忽略此帖。

【问题讨论】:

你为什么要给Flask打两次电话?你只需要它在主。 感谢您的建议。我删除了它,但问题仍然存在。 与其编辑问题,不如提交一个答案(循环导入),然后将其标记为已关闭。有人可能会通过搜索引擎提出这个问题,而您将成为那个人的英雄。 【参考方案1】:

导致的问题与循环导入有关。

请在询问之前检查您导入的内容。

【讨论】:

以上是关于如何防止flask-sqlalchemy中的双重数据提交的主要内容,如果未能解决你的问题,请参考以下文章

如何防止iOS应用程序中的地理定位双重提示?

事件跟踪:如何防止双重加载analytics.js

防止数组中的双重条目[重复]

如何防止使用 jQuery 或 Javascript 进行双重提交?

JS:如何防止 let 双重声明? / 判断是不是定义了 let 变量

如何防止在 UINavigationbar 上同时触摸按钮的双重动作?