sqlalchemy

时间:2015-06-25 15:02:02

标签: python flask sqlalchemy

请问我在第一个 sqlachemy 应用中遇到此问题。我试图查询posgres的db并返回匹配的行。以下是我的代码。

app.py

from sqlalchemy.orm import sessionmaker
from models.models import Base,User,Product,ProductItem,DATABASE, initialize

engine = DATABASE
Base.metadata.bind = (engine)

DBSession = sessionmaker(bind=engine)
session = DBSession()

....


@app.route('/login', methods = ['GET','POST'])
def login():
    form = RegisterForm.LoginForm()
    if request.method == 'GET':
        return render_template('login.html', form=form)
    return authenticate(form = form)

def authenticate(form):
    if form.validate_on_submit():
        try:
            user = session.query(User).filter(User.email == 'xxxx@yahoo.com')
            if session.query(exists().where(User.email == form.email.data)).scalar() :
                return user.name
        except :# models.DoesNotExist:
            flash("Your email or password does not match !", "error")
            return 'error'

我的模块位于单独的文件夹模块中

模块/ modules.py

#declarations

Base = declarative_base()

engine = create_engine('postgresql://postgres:0102443167@localhost:5432/postgres',echo=True)
Base.metadata.bind = (engine)

DBSession = sessionmaker(bind=engine)
session = DBSession()

DATABASE = engine

class User(UserMixin , Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    title = Column(CHAR(3), nullable = False)
    fname = Column(String(100), nullable = False)
    lname = Column(String(100), nullable = False)
    username = Column(String(100), nullable = False, unique = True)
    email = Column (String(50), nullable =False, unique = True)
    password = Column(String(100), nullable = False)
    address = Column(String(250), nullable = False)
    state = Column(String(50), nullable = False)
    is_Admin = Column(Boolean ,default = False)
    is_Logged = Column(Boolean, default = False)
    is_Active = Column (Boolean , default = False)
    is_Block = Column(Boolean, default = False)
    joined_On = Column(ArrowType)

    ......

我的问题在于app.py身份验证方法。代码

user = session.query(User).filter(User.email == form.email.data)

提出错误。当我检查form.email.data时返回正确的字符串。但是,当我尝试

 if session.query(exists().where(User.email == form.email.data)).scalar() :
         return 'Ok'

按预期工作。它工作得很完美,因此让我意识到问题可能与我的查询有关。然后我尝试了

if session.query(exists().where(User.email == form.email.data)).scalar() :
       return user.lname

并且它引发错误,说用户没有应该具有的属性名称。我很困惑。请问如何从我的表中查询记录?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

您必须获取与查询匹配的第一个对象,因此您必须在查询末尾添加.first()

user = session.query(User).filter(User.email == form.email.data).first()

请参阅here更多信息。