Flask-AppBuilder эквивалент предложения SQLite WHERE для фильтрации данных столбца - PullRequest
0 голосов
/ 05 сентября 2018

Я новичок во Flask и начал проектировать интерфейс для базы данных управления запасами, используя Flask-AppBuilder.

Я создал несколько моделей, и мне удалось отобразить мои данные sqlite в таблицах, используя Flask-AppBuilder views.

Однако я не могу найти эквивалент SQLite WHERE для фильтрации или «ограничения» данных столбцов. Я много читал о sqlalchemy, фильтрах, запросах, но это еще больше смутило меня, чем что-либо еще, и объяснения кажутся чрезвычайно сложными и сложными для выполнения чего-то, что чрезвычайно просто.

Предполагается, что мы воспроизводим следующий запрос SQLite во Flask-AppBuilder:

SELECT Field_A
FROM Table_A
WHERE Field_A = 'some text'

с:

result = session.query(Table_A).filter_by(Field_A = 'some text').all()

Куда идет приведенная выше строка кода в моем приложении?

Учитывая, что у меня есть следующее Class:

class Table_A(Model):
    id = Column(Integer, primary_key=True)
    Field_A =  Column(String)

    def __repr__(self):
        return self

и View:

class Table_AView(ModelView):
    datamodel = SQLAInterface(Table_AView)
    label_columns = {'Field_A':'A'}
    list_columns = ['Field_A']

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

После долгих копаний flask-appbuilder использует свой собственный класс фильтра , чтобы вы могли отфильтровать свои представления.

Все классы упоминаются здесь на GitHub: Список предложений по фильтрам для колб

Также нет разницы между FilterEqual и FilterEqualFunction здесь: В чем разница между: FilterEqual и FilterEqualFunction?

Для других настроек и первого порта вызова Flask-appbuilder перейдите прямо к Справочнику по API , где вы найдете несколько примеров фильтрационного класса в действии.

По сути, это очень просто. В коде views.py в классе ModelView, который вы хотите отфильтровать, просто добавьте base_filters = [['field_A', FilterEqual, 'abc']] примерно так:

`class Table_AView(ModelView):
    datamodel = SQLAInterface(Table_AView)
    label_columns = {'Field_A':'A'}
    list_columns = ['Field_A']
    base_filters = [['field_A', FilterEqual, 'abc']]`

Это покажет только те строки, где переменная field_A равна abc.

Надеюсь, это кому-нибудь поможет, потому что мне понадобилось почти (вздох) две недели, чтобы понять это ...

0 голосов
/ 05 сентября 2018

SQLALchemy - это ORM (объектно-реляционное отображение), это означает, что вам не нужно иметь дело с необработанным SQL, вы будете вызывать функцию, которую вы «строите» (добавляя фильтры в вашем случае). Он будет прозрачно генерировать SQL-запрос, выполнять его и возвращать результат в виде объектов Python.

Я бы посоветовал вам снова внимательно прочитать документацию по sqlalchemy о фильтрах, особенно filter_by: http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.filter_by

Это самый простой способ применить WHERE с sqlalchemy. Если вы правильно объявили модель для Table_A, вы сможете использовать ее так:

result = session.query(Table_A).filter_by(Field_A = 'some text').all()

Здесь session.query(Table_A).filter_by(Field_A = 'some text') сгенерирует SQL, а .all() выполнит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...