Непредвиденный формат возврата функции фильтра в sqlalchemy - PullRequest
0 голосов
/ 08 мая 2019

Я хочу получить свой пароль пользователя с функцией фильтра в 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 Ответ

1 голос
/ 08 мая 2019

Это немного зависит от того, является ли 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...