我想在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',)
答案 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