sqlalchemy中过滤器函数的异常返回格式

时间:2019-05-08 00:12:09

标签: python sqlalchemy

我想在sqlalchemy中使用过滤功能获取用户密码,但是返回的格式错误。这是什么原因?

这是我的数据库: 用户名:asdef密码:1234

engine = create_engine('sqlite:///',echo=True)
Base = declarative_base()

class User(Base):
   __tablename__ = 'user'
   id = Column(Integer, primary_key=True)
   username = Column(String(50))
   password= Column(String(50))
   name=Column(String(50))
   surname=Column(String(50))


Session = sessionmaker(bind=engine)
session = Session()
for password in session.query(User.password).filter(User.username=='asdef'):
   print (password)   
session.commit()

我希望输出为'1234',但实际输出为('1234',)

1 个答案:

答案 0 :(得分:1)

这在某种程度上取决于User.username是否唯一。如果只希望查询返回一行(或不返回一行),则可以使用Query.scalar()

  

返回第一个结果的第一个元素;如果没有行,则返回None   当下。如果返回多行,则引发MultipleResultsFound。

它看起来像:

password = session.query(User.password).filter(User.username == 'asdef').scalar()
print(password)  # 1234

...即不在for循环中。

但是,如果查询session.query(User.password).filter(User.username == 'asdef')可以返回多行(即,一个以上具有相同用户名的用户,并且这可能是您想要的,因为您正在for循环中访问查询) .scalar()会失败,因为内部使用Query.one()会导致MultipleResultsFound异常,如果查询返回多行。在这种情况下,您实际上只需要索引密码或使用属性查找(行代理可以执行任一操作)来获取密码:

for row in session.query(User.password).filter(User.username == 'asdef'):
    # both of these will print the same thing, but the second one
    # makes for nicer reading!
    print(row[0])
    print(row.password)

# output:
# 1234
# 1234