【问题标题】:Why join table query always return none Flask-SqlAlchemy?为什么连接表查询总是不返回 Flask-SqlAlchemy?
【发布时间】:2019-01-30 03:56:01
【问题描述】:

我是 Python 和 Flask-SqlAlchemy 的初学者,我只是想不通为什么 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 表中获取 id,name 和在 Device 表中获取 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()

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    刚刚测试了以下,它工作正常。

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

    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
    

    【讨论】:

    • 好吧,然后只需遍历设备对象并只选择您需要的 3 列。
    • 兄弟我用查询作为你的状态,但是数据返回是这样的{"data": [ ] }
    • 即使数据存在于数据库中
    • 您确定 data['email'] 返回的内容甚至可以在过滤器中使用吗?您能否在没有过滤器的情况下进行测试,所以只需 Device.query.join(User).all() 并循环打印输出吗?如果数据库中存在数据,这应该返回一些东西。
    • 现在控制台中的返回是这样的[<User 'None'>, <User 'None'>, <User 'None'>, <User 'None'>, <User 'None'>]
    猜你喜欢
    • 2019-12-13
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2021-05-24
    相关资源
    最近更新 更多