【问题标题】:Unexcepted return format of filter function in sqlalchemysqlalchemy中过滤器函数的无异常返回格式
【发布时间】:2019-05-08 00:12:09
【问题描述】:

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

【问题讨论】:

标签: python sqlalchemy


【解决方案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 循环中访问查询)而不是 @ 987654327@ 将失败,因为它在内部使用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

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 2021-09-09
    • 2020-08-23
    • 1970-01-01
    • 2022-06-18
    • 2016-08-03
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多