更具体的SQL查询与烧瓶,跆拳道queryselectfield(More specific SQL

2019-10-21 02:49发布

我想创建一个使用瓶和WTF一个登录表格。 该应用程序应阅读所有用户的昵称了一个数据库表,并在QuerySelectField显示它们。

它的工作 - 但我认为我可以在一个“更好的方式”做...

我有一个这样的数据库表:

 id | nickname  |    fullname    |          email
----+-----------+----------------+--------------------------
  1 | Admin     | The Admin      | admin@example.com
  2 | JDoe      | John Doe       | jd@example.com

在我的models.py我有对应的类用户和功能的getUser:

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    fullname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)

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

# used for query_factory    
def getUser():
    u = User.query
    return u

forms.py包含表单类

from flask.ext.wtf import Form
from wtforms import StringField, BooleanField, SelectField
from wtforms.validators import DataRequired, Required
from wtforms.ext.sqlalchemy.fields import QuerySelectField

from .models import User, getUser

class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    user = QuerySelectField(u'User', query_factory=getUser, get_label='nickname')

正如我所说的,所有的昵称在我QuerySelectField很好地出现。

<select id="user" name="user"><option value="1">Admin</option><option value="2">JDoe</option></select>

但是,我想知道这是由该查询:

INFO sqlalchemy.engine.base.Engine SELECT "user".id AS user_id, "user".nickname AS user_nickname, "user".fullname AS user_fullname, "user".email AS user_email
FROM "user"

似乎整个表格返回,我收到不必要的数据(全名和电子邮件),太。 这是我想避免的。

我怎么能只查询User.id和User.nickname和QuerySelectField显示呢? (当然,我做研究 - 我tryed filter_by或User.query(User.id,User.nickname) - 但只得到了约不匹配元组的错误)

任何人都可以帮忙吗?

提前致谢!

Answer 1:

不知道您所使用的SQLAlchemy的版本,但由于0.9.0有sqlalchemy.orm.load_only它可以用来轻松地返回列的子集的查询。

您可以修改getUser()为类似以下内容:

from functools import partial
from sqlalchemy import orm

def getUser(columns=None):
    u = User.query
    if columns:
        u = u.options(orm.load_only(*columns))
    return u

def getUserFactory(columns=None):
    return partial(getUser, columns=columns)

# subsequently when defining LoginForm
user = QuerySelectField(u'User',
                        query_factory=getUserFactory(['id', 'nickname']),
                        get_label='nickname')


文章来源: More specific SQL query with flask-wtf queryselectfield