这可能是一个非常简单的问题,但作为我这个新手,我必须在这里问,抱歉,因为我还没有找到答案,到目前为止,经过大量的玩耍。
我正在使用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
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()]