【问题标题】:How to fetch column values using SQLAlchemy?如何使用 SQLAlchemy 获取列值?
【发布时间】:2013-03-28 19:29:14
【问题描述】:

我正在使用 Flask+Python 并检查 用户名(和 电子邮件)是否已被占用,我正在使用此逻辑:

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = SignupForm()
    if form.validate_on_submit():
      user = Users.query.filter_by(username=form.username.data).first()
      email = Users.query.filter_by(email=form.email.data).first()
      if form.username.data in user:
        error = 'Username already taken. Choose another'
      elif form.email.data in email:
        error = 'Email already registered. Login or register with another Email'
      else:
          user = Users( 
          form.username.data,
          form.password.data,
          #form.confirm.data ,
          form.email.data,
          1,
          # form.cityaddress.data,
          # form.countryaddress.data,
          #form.accept_tos.data,
      )
      db.session.add(user)
      db.session.commit()
      return redirect(url_for('index'))

但它给出的错误就像object has no attribute 'username'

我知道我从 db 获取数据的逻辑不正确。我对 SQLalchemy 知之甚少。

你能建议我如何从表Users 中获取Username(和Email)列值,然后检查它们是否与form.username.data 相同?

【问题讨论】:

  • 能否请您粘贴确切的错误,包括出错的行?

标签: python database sqlalchemy flask


【解决方案1】:

您的查询看起来不错,first() 的返回值将是您的 User 对象的一个​​实例,如果没有结果,则为 None

  u = Users.query.filter_by(username=form.username.data).first()
  if u is not None:
      print u.username
      print u.email      

因此,您的逻辑如下所示:

  user_by_name = Users.query.filter_by(username=form.username.data).first()
  user_by_email = Users.query.filter_by(email=form.email.data).first()
  if user_by_name:
    error = 'Username already taken. Choose another'
  elif user_by_email:
    error = 'Email already registered. Login or register with another Email'
  else:
      #Unique user and email

您也可以在一个查询中完成:

 existing = Users.query.filter((Users.username == form.username.data) | (Users.email == form.email.data)).all()
 if existing:
     error = 'User or email taken'

注意使用filter 而不是filter_by - 你不能在filter_by 中使用位运算符。这是一个快速的working example

【讨论】:

    【解决方案2】:

    你的错误让我很困惑。也就是说,除了测试之外,您的代码看起来还不错。那我就用这个:

    user = Users.query.filter_by(username=form.username.data).first()
    ...
    if user is not None:
        error("user already found")
    

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 1970-01-01
      • 2019-02-14
      • 2015-12-31
      • 2015-04-29
      • 2021-03-14
      • 2016-06-16
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多