Nano Hash - криптовалюты, майнинг, программирование

Как запросить базу данных по идентификатору с помощью SqlAlchemy?

Мне нужно запросить базу данных SQLAlchemy по ее id чему-то похожему на

User.query.filter_by (username = 'peter')

но для id. Как мне это сделать? [Поиск в Google и SO не помог]

19.07.2011

  • Пожалуйста, предоставьте более подробную информацию, например, эквивалентный SQL или псевдокод, выполняющий то, что вы хотите. Что такое идентификатор базы данных SQLAlchemy? 20.07.2011
  • Есть ли в вашей таблице столбец идентификаторов? 20.07.2011

Ответы:


1

В запросе есть функция get, которая поддерживает запрос по первичному ключу таблицы, который, как я предполагаю, равен id.

Например, чтобы запросить объект с ID 23:

User.query.get(23)

Примечание. Как уже упоминалось несколькими другими комментаторами и ответами, это не просто сокращение для «Выполнить фильтрацию запроса по первичному ключу». В зависимости от состояния сеанса SQLAlchemy запуск этого кода может запросить базу данных и вернуть новый экземпляр, или он может вернуть экземпляр объекта, запрошенного ранее в вашем коде, без фактического запроса базы данных. Если вы еще этого не сделали, попробуйте прочитать документацию по сеансу SQLAlchemy, чтобы понять его последствия.

20.07.2011
  • Функция Get также поддерживает несколько первичных ключей: YourModel.query.get((pk1, pk2)). Обратите внимание на кортеж. 01.02.2018
  • Функция get() запрашивает объекты по первичному ключу. Если вы хотите запросить по id, вы должны сначала установить id в качестве первичного ключа. 07.10.2019
  • Поскольку Query.get () устарел, начиная с версии 1.4, является ли замена session.get(User, 5)? 07.05.2021
  • что мне использовать, если я хочу вернуть более одного пользователя по идентификатору? Как User.query.get(23,24,25,58,21) ?? 18.05.2021

  • 2

    Вы можете запросить пользователя с id = 1 следующим образом

    session.query(User).get(1)

    22.04.2016

    3

    get () иногда не соответствует вашим ожиданиям:

    если ваша транзакция была совершена:

    >>> session.query(User).get(1)
    [SQL]: BEGIN (implicit)
    [SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
    FROM user
    WHERE user.id = ?
    [SQL]: (1,)
    <User(u'ed', u'Ed Jones')>
    

    если вы участвуете в транзакции (get () предоставит вам объект результата в памяти без запроса базы данных):

    >>> session.query(User).get(1)
    <User(u'ed', u'Ed Jones')>
    

    лучше использовать это:

    >>> session.query(User.name).filter(User.id == 1).first()
    [SQL]: SELECT user.name AS user_name
    FROM user
    WHERE user.id = ?
     LIMIT ? OFFSET ?
    [SQL]: (1, 1, 0)
    (u'Edwardo',)
    
    24.08.2018
  • Чем такое неожиданное поведение? 17.11.2018
  • Я имею в виду, что если вы участвуете в транзакции (еще не сеансе.commit), get(), кажется, дает вам объект результата в памяти (без фактического запроса базы данных), но filter().first() всегда будет запрашивать базу данных. 19.11.2018
  • Возможно ли одновременное изменение базы данных во время транзакции? Если нет, то лучше использовать get из-за повышения эффективности. 19.11.2018
  • поскольку я знаю, что sqlalchemy не может работать с асинхронным материалом (кажется, только с gevent), и да, get более эффективен. 20.11.2018
  • Почему .first () отличается от .get () в том, что касается транзакции? Всегда ли .first () возвращается в базу данных? Это то, что .get () сначала просматривает текущий env, чтобы узнать, знает ли он этот идентификатор или что-то в этом роде? 22.08.2019
  • Это хороший момент, но я не думаю, что это неожиданно - именно так работает каждый ORM с кешем ... было бы неожиданно, если бы он не работал сделай это 27.08.2019
  • Да, я имею в виду, что мы должны знать get() использовать кеш, а query().filter().first(), похоже, нет. 29.08.2019
  • что мне использовать, если я хочу вернуть более одного пользователя по идентификатору? Нравится User.query.get(23,24,25,58,21)? 18.05.2021

  • 4

    Если вы используете tables reflection, у вас могут возникнуть проблемы с приведенными решениями. (Предыдущие решения здесь не работали для меня).

    В итоге я использовал:

    session.query(object._class_).get(id)
    

    (object был получен отражением из базы данных, поэтому вам нужно использовать .__class__)

    Надеюсь, это поможет.

    21.10.2019
  • что мне использовать, если я хочу вернуть более одного пользователя по идентификатору? Нравится User.query.get(23,24,25,58,21)? 18.05.2021

  • 5

    Во-первых, вы должны установить id в качестве первичного ключа.
    Затем вы можете использовать метод query.get() для запроса объектов по id, который уже является первичным ключом.

    Начиная с метода query.get() для запроса объектов по первичному ключу.
    Получено из Документация по Flask-SQLAlchemy

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    db = SQLAlchemy()
    db.init_app(app)
    
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
    
    def test():
        id = 1
        user = User.query.get(id)
    
    07.10.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование