如何在flask中用数据库查询填充下拉框而不是列表?

问题描述 投票:0回答:1

这可能是一个非常简单的问题,但作为我这个新手,我必须在这里问,抱歉,因为我还没有找到答案,到目前为止,经过大量的玩耍。

我正在使用flask和一个Python食物类型列表,允许用户在表单中输入一个食物项目,并通过验证器验证,以确保该项目在列表中。从表单中输入的食物项目会被存储在db表中。

我希望用数据库中预先定义的食品类型的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') (table &column),但没有成功。

我不知道是否需要在model.py中为这个SelectGET操作创建某种类方法,或者甚至使用类似pandas(我在应用程序中也有)的东西来完成这项工作。

希望得到任何指导

谢谢,md

python flask flask-sqlalchemy
1个回答
1
投票

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()]
© www.soinside.com 2019 - 2024. All rights reserved.