如何使用 SQLAlchemy 获取列值?

Man*_*lue 4 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'))
Run Code Online (Sandbox Code Playgroud)

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

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

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

Daz*_*all 6

您的查询看起来很好,返回值first()将是您的 User 对象的实例,或者None如果没有结果:

  u = Users.query.filter_by(username=form.username.data).first()
  if u is not None:
      print u.username
      print u.email      
Run Code Online (Sandbox Code Playgroud)

鉴于此,您的逻辑可能如下所示:

  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
Run Code Online (Sandbox Code Playgroud)

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

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

请注意使用filternot filter_by- 您不能在 中使用按位运算符filter_by。这是一个快速工作示例