繁体   English   中英

为什么联接表查询总是不返回Flask-SqlAlchemy?

[英]Why join table query always return none Flask-SqlAlchemy?

我是Python和FlaskSqlAlchemy的初学者,我无法弄清为什么query.join()总是不返回none ,即使我的表具有确切的数据也是如此。

这是我的桌子:

class User(db.Model):
    __tablename__ = "users_info"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.Integer, unique=True, nullable=True)
    email = db.Column(db.String)

    user_device = db.relationship('Device', backref='user')


class Device(db.Model):
    __tablename__ = "user_device"  

    device_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    id = db.Column(db.Integer, db.ForeignKey(User.id))
    private_token = db.Column(db.String, nullable=True)

我的目标是在User表中获取idUser表中的nameDevice表中的private_token以使User.email等于单个查询中的某个值。

所以这是我尝试的:

User.query.join(Device, User.id == Device.id)\
            .add_columns(User.id, User.name, Device.private_token)\
            .filter_by(User.email == data['email'])

我在上面的查询中使用了filter()filter_by() 。但是最后它仍然none返回。

所以我的问题是,如何正确加入表? 有什么方法可以实现上述目标?

编辑:

我试图添加.add().first()在上面的查询,显示出来的结果仅仅是[ ]我在控制台上打印后。

User.query.join(Device, User.id == Device.id)\
                .add_columns(User.id, User.name, Device.private_token)\
                .filter_by(User.email == data['email']).all()

只需测试以下内容,即可正常运行。

我创建模型如下,并将一些测试数据添加到表中:

class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.Integer, unique=True, nullable=True)
email = db.Column(db.String)
devices = db.relationship('Device', backref='user')

class Device(db.Model):
__tablename__ = "device"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
uuser_id = db.Column(db.Integer, db.ForeignKey('user.id'))
private_token = db.Column(db.String, nullable=True)

像这样的烧瓶代码:

@bp.route('/',  methods=['POST', 'GET'])
def home():

    devices = db.session.query(Device, User).join(User).filter(User.email == "test1@gmail.com").all()

    return render_template('main/home.html',
    devices = devices,
   )

要访问不同的属性,请在模板中创建一个循环,如下所示:

{% for d in devices %}
  user id: {{ d.User.id }},
  name: {{ d.User.name }},
  private token: {{ d.Device.private_token }}
{% endfor %}

创建具有用户ID,用户名和令牌的字典对象:

    x = {}
    for d in devices:
        x['user_id'] = d.UUser.id
        x['user_name'] = d.UUser.name
        x['private_token'] = d.Device.private_token

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM