Как заполнить выпадающий список запросом к базе данных вместо списка в flask - PullRequest
0 голосов
/ 30 апреля 2020

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

Я использую flask со списком python типов продуктов, позволяющим пользователям вводить элемент питания в форму, и проверять его с помощью валидаторов, чтобы убедиться, что элемент находится в списке. Введенные продукты из формы затем сохраняются в таблице базы данных.

I wi sh, чтобы заменить этот подход списка на запрос sql из базы данных предварительно определенных типов продуктов питания, в то время как с использованием SQLAlchemy как это используется в другом месте приложения.

Упрощенная версия кода выглядит следующим образом: -

#db connection is already setup and working OK in another part of the app
DB_URL = 'postgresql+psycopg2://{user}:{pw}@{url}:{port}/{db}'.format(user=POSTGRES_USER, pw=POSTGRES_PW, url=POSTGRES_URL, port=POSTGRES_PORT, db=POSTGRES_DB)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
db = SQLAlchemy(app)

#example of the list
eaten = ['bread', 'crackers', 'ham', 'bacon']

#where the 'food_word' variable gets defined from an input and validated
food_word_1 = StringField('add the food type you have eaten here:', validators=[Optional(), AnyOf(eaten)])

Я пытался заменить список на eaten = db.execute('SELECT food_name FROM food_type') (таблица и столбец ) без удачи.

Я не уверен, нужно ли мне создавать какие-то классы / методы в model.py для этой операции Select / GET или даже использовать что-то вроде pandas (которое я также есть в приложении), чтобы сделать эту работу.

Любое руководство приветствуется!

спасибо, MD

1 Ответ

0 голосов
/ 30 апреля 2020

SQLAlchemy - объектно-реляционный картограф. Помогает взаимодействовать с базой данных без запроса SQL. Это абстракция к базе данных. Таким образом, вы не должны писать SQL запрос здесь. Скорее вы должны создать унаследованный класс от db.Model. Как ниже.

class FoodType(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    food_name = db.Column(db.String(120), unique=True, nullable=False)

def __repr__(self):
    return '<User %r>' % self.food_name

Затем для извлечения данных необходимо вызвать функцию запроса,

 db.query.all()
 # or
 db.query.filter_by()

Результатом будет один список.

Если вы используете postgres напрямую, без SQLAlchemy, тогда запрос SQL будет выглядеть так:

>>> conn = psycopg2.connect(DATABASE_URL)
>>> cur = conn.cursor()
>>> cur.execute('SELECT food_name FROM food_type')
>>> cur.fetchall()
[['bread'], ['crackers'], ['ham'], ['bacon']]

Если вы хотите преобразовать как один список,

eaten = [i[0] for i in db.fetchall()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...