如何使用SQLAlchemy获取列值?

时间:2013-04-06 10:44:49

标签: python database sqlalchemy flask

我正在使用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知之甚少。

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

2 个答案:

答案 0 :(得分:3)

您的查询看起来很好,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

答案 1 :(得分:1)

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

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