我是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)
我的目标是在id
表中获得name
,User
,在private_token
表中获得Device
1}}等于单个查询中的某个值。
这就是我尝试的方法:
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()
。
[ ]
答案 0 :(得分: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