Модель экземпляра класса объекта из чистого запроса SQL? - PullRequest
0 голосов
/ 12 марта 2019

Я работаю над своим первым подходящим веб-приложением, следуя «Мега-учебнику Flask».Это помогло мне начать работу с SQLAlchemy ORM и дало мне некоторое представление о том, как использовать этот инструмент.

Например, у меня есть класс Pet.Я могу позвонить

foo = Pet.query.filter_where(id=1).first() 

, это приводит к Фу класса Pet.Определение Pet имеет много атрибутов, но каждый из них имеет тип «db.Column», что имеет смысл, потому что каждый Pet является записью в таблице Pets.

Там, где я запутался, теперь я хочу выполнить более сложный SQL для таблицы Pet, но у меня все еще есть доступ к этим записям в качестве объектов Pet.

pets = db.session.execute('SELECT * FROM pet WHERE blahblah = blahblah').fetch_all()

И теперь у меня есть эти питомцыПеречислите, какие все атрибуты для каждой записи питомца возвращены запросом.

Как теперь создать экземпляры объектов класса Pet для каждой из этих записей?Когда я запрашиваю с ORM, я получаю объекты обратно.Мой класс Pet, как определено в app / models.py, не имеет init , который принимает любые аргументы.

Прямо сейчас я беру список результатов, извлекаю значение "id" из результатов, а затем в цикле for, создавая их все как объекты

pets = db.session.execute('SELECT * FROM pet WHERE blahblah = blahblah').fetch_all()

pet_objects=[]

for p in pets:
  record_id = p.id
  pet_object = Pet.query.filter_where(id=record_id)
  pet_objects.append(pet_object)

Из какой точкиЯ могу обрабатывать свой список объектов Pet так же, как результаты запроса с использованием ORM, который автоматически возвращает объекты.

У меня вопрос, правильно ли я делаю?Кажется неправильным, потому что для каждой записи я сначала ударил базу данных с помощью своего SQL, а затем снова для создания экземпляра объекта по его 'id', но я не уверен, как еще перейти от записи -> Object в этой структуре.

Извините за длинный вопрос, но я уже некоторое время с этим борюсь.

1 Ответ

1 голос
/ 12 марта 2019

Поправьте меня, если я ошибаюсь, вы хотите добиться результата этого запроса SELECT * FROM pet WHERE blahblah = blahblah, используя sqlalchemy.

Вы можете использовать метод filter_by в классе base query:

например, для вашего запроса вы можете использовать это:

pet_objects = Pet.query.filter_by(blahblah='blahblah').all()

Вы можете создавать еще более сложные запросы, используя соединение, или просто добавить дополнительные ограничения, добавив дополнительные аргументы в filter_by, например: query.filter_by(col_1= 'something', col_2 = 'another thing')

...