【问题标题】:Flask-Sqlalchemy taking non unique values for a 'unique' integerFlask-Sqlalchemy 为“唯一”整数采用非唯一值
【发布时间】:2015-04-29 19:46:21
【问题描述】:

考虑以下代码:

class User(db.Model):
    id=db.Column(db.Integer,primary_key=True)
    email=db.Column(db.String,unique=True)
    name=db.Column(db.String)
    password=db.Column(db.String)
    registration_num=db.Column(db.Integer,unique=True)

    def __repr__(self):
          return "<Name %r>, <id %r>" %(self.name,self.id)

在这里,我尝试创建一个具有唯一电子邮件 ID(稍后用作登录 ID)和唯一注册号(稍后用作文件夹名称以保存用户提交的数据)的用户。 虽然 email 列拒绝非唯一值,但无论我创建多少具有相同注册号的用户,registration_num 都不会引发任何标志。

下面是用于注册页面的装饰器:

@app.route('/register', methods=['GET','POST'])
def register():
    if request.method == 'POST':
        userpass=request.form["password"]
        usermail=request.form["username"]
        nameofuser=request.form["name"]
        reg_num=int(request.form["r_num"])
        u=models.User(email=usermail,name=nameofuser,password=userpass,registration_num=reg_num)
        db.session.add(u)
        db.session.commit()
        return redirect(url_for('login'))

    return render_template('register_form.html')

我在这里做错了什么?

【问题讨论】:

标签: python flask flask-sqlalchemy


【解决方案1】:

我想您在数据库中将email 声明为UNIQUE,但不是registration_num。在模型中设置 unique=True 不会自动影响数据库,并且 SQLAlchemy 不会检查是否已经存在具有该值的某些行。 unique=True 它被 create_all 或 sqlalchemy-migrate 使用。

【讨论】:

  • 嗨。每当我编辑任何模型时,我都会迁移(如巨型烧瓶教程网站中所述),但同样的问题仍然存在。因此,从您的回答中提取问题,我删除了旧数据库并重新开始。现在它工作正常!我不明白。如果我们迁移它不会相应地更新表吗?还是必须在我们第一次创建数据库时声明唯一性?
  • 这取决于您用于迁移的内容。我这样做的方式是:我为 sqlalchemy-migrate 创建了一个迁移脚本,如果我将“UNIQUE”添加到模型的列中,我会明确包含“alter table”。您可以拥有一个完全神奇的工具,将模型与数据库表进行比较并猜出要做什么,但您显然不会使用它:)
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2019-03-04
  • 2019-02-04
  • 2013-11-20
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多