Flask SQLAlchemy запрос возвращает строку запроса вместо фактического результата - PullRequest
0 голосов
/ 12 октября 2019

Я использовал flask-sqlalchemy для создания миксина в файле с именем itemAbstract.py, который будет использоваться двумя классами моделей: ItemModel и ItemHistoryModel соответственно. Ниже приведен код, который я написал в itemAbstract.py

from databaseHandler import databaseHandler
from sqlalchemy.ext.declarative import declared_attr

# pylint: disable=maybe-no-member

class Item(databaseHandler.Model):
    __abstract__ = True

    itemName = databaseHandler.Column(databaseHandler.String(80), nullable = False)

    price = databaseHandler.Column(databaseHandler.Numeric, nullable = False)

    itemImage = databaseHandler.Column(databaseHandler.String(1000), nullable = False)

    @classmethod
    @declared_attr
    def restaurantId(cls):
        return databaseHandler.Column(
            databaseHandler.Integer, databaseHandler.ForeignKey("restaurant.restaurantId"))

    @classmethod
    @declared_attr
    def restaurant(cls):
        return databaseHandler.relationship(
            "RestaurantModel", backref=databaseHandler.backref('items', lazy=True))

    @classmethod
    @declared_attr
    def productTypeId(cls):
        return databaseHandler.Column(
            databaseHandler.Integer, databaseHandler.ForeignKey("product_type.productTypeId"))

    @classmethod
    @declared_attr
    def productType(cls): 
        return databaseHandler.relationship(
            "ProductTypeModel", backref=databaseHandler.backref('items', lazy=True))

И я унаследовал его в itemModel.py и itemHistoryModel.py примерно так:

from databaseHandler import databaseHandler
from sqlalchemy import and_, or_
from abstracts.itemAbstract import Item

# pylint: disable=maybe-no-member

class ItemModel(Item):

    __tablename__ = 'item'

    itemId = databaseHandler.Column(databaseHandler.Integer, primary_key = True)

И

from databaseHandler import databaseHandler
from sqlalchemy import and_, or_
from abstracts.itemAbstract import Item


# pylint: disable=maybe-no-member

class ItemHistoryModel(Item):

    __tablename__ = 'item_history'

    historyId = databaseHandler.Column(databaseHandler.Integer, primary_key = True)

У меня есть метод класса в обоих файлах, который должен помочь мне получить список товаров, которые продает ресторан, передавая restaurantId в качестве параметра

@classmethod
def findItemsByRestaurant(cls, param):
    return cls.query.filter_by(restaurantId = param)

Однако в любое времяЯ выполняю этот метод, он возвращает строку запроса в наборе результатов вместо списка элементов. Вот примерный набор результатов:

SELECT item_history.`itemName` AS `item_history_itemName`, item_history.price AS item_history_price, item_history.`itemImage` AS `item_history_itemImage`, item_history.`historyId` AS `item_history_historyId` 
FROM item_history 
WHERE false = 1

Каким-то образом SQLAlchemy делает мой параметр false и присваивает ему значение 1, в то время как фактический идентификатор ресторана равен 10. Что я делаю не так?

Это файл databaseHandler.py:

from flask_sqlalchemy import SQLAlchemy

databaseHandler = SQLAlchemy()

1 Ответ

0 голосов
/ 12 октября 2019

Объект Query имеет ряд API-методов для получения питонических объектов, а не для изменения запроса:

  • get
  • all
  • from_statement
  • first
  • one_or_none
  • one
  • скаляр (as_scalar подлежит амортизации)
  • count
...