Python 如何联接两个表并将结果作为对象
我想用SQLalchemey连接两个表Python 如何联接两个表并将结果作为对象,python,sqlalchemy,Python,Sqlalchemy,我想用SQLalchemey连接两个表 class Transaction(db.Model): __tablename__ = 'transaction' id = db.Column(db.Integer, primary_key=True, autoincrement=True) user = db.Column(db.ForeignKey('user.id')) bookedBy = db.Column(db.ForeignKey('user.id'))
class Transaction(db.Model):
__tablename__ = 'transaction'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
user = db.Column(db.ForeignKey('user.id'))
bookedBy = db.Column(db.ForeignKey('user.id'))
product = db.Column(db.ForeignKey('product.name'))
amount = db.Column(db.Integer, default=1)
price = db.Column(db.Integer)
timestamp = db.Column(db.TIMESTAMP(6))
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.VARCHAR(255), primary_key=True)
givenName = db.Column(db.VARCHAR(255))
familyName = db.Column(db.VARCHAR(255))
birthday = db.Column(db.Date)
在SQL中,我的代码是这样的
SELECT * FROM transaction JOIN user u on transaction.bookedBy = u.id
结果,我得到了一个我所期望的表,其中两个表都连接在一起。
在Python中,我尝试了以下方法:
db.session.query(transaction_db.Transaction, user_db.User).join(user_db.User, transaction_db.Transaction.bookedBy == user_db.User.id).all()
结果是这样的:
[(<Transaction 37>, <User 1>), (<Transaction 38>, <User 2>), (<Transaction 39>, <User 1>), (<Transaction 40>, <User 1>), (<Transaction 41>, <User 1>), (<Transaction 42>, <User 1>), (<Transaction 43>, <User 2>), (<Transaction 44>, <User 1>)]
[(,),(,),(,),(,),(,),(,),(,),(,),(,),(,)]
结果是正确的,但我不希望有元组,而希望有一个对象,连接在其中。诸如此类:
[<Transaction 37 with User 1>, <Transaction 38 with User 2>, ...]
[
{
"id": 0,
"user_id": "string",
"booked_by_id": "string",
"booked_by": [
{
"id": "string",
"givenName": "string",
"familyName": "string",
"birthday": "string"
}
],
"product_id": "string",
"amount": 0,
"price": 0,
"timestamp": "2019-08-19T11:54:20.572Z"
}
]
[,…]
有人能帮忙吗
谢谢 根据您指定的所需输出,看起来您只需要一个事务列表,而不是元组列表。您可以通过多种方式来实现这一点,最简单的方法是列表理解
看看这里:在@Wolph给我一个提示后,我就知道了。 我将数据库模型修改为:
class Transaction(db.Model):
__tablename__ = 'transaction'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
user_id = db.Column(db.ForeignKey('user.id'))
booked_by_id = db.Column(db.ForeignKey('user.id'))
product_id = db.Column(db.ForeignKey('product.id'))
amount = db.Column(db.Integer, default=1)
price = db.Column(db.Integer)
timestamp = db.Column(db.TIMESTAMP(6))
user = db.relationship('User', foreign_keys=[user_id])
booked_by = db.relationship('User', foreign_keys=[booked_by_id])
product = db.relationship('Product', foreign_keys=[product_id])
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.VARCHAR(255), primary_key=True)
givenName = db.Column(db.VARCHAR(255))
familyName = db.Column(db.VARCHAR(255))
birthday = db.Column(db.Date)
现在我的python查询是:
db.session.query(transaction_db.Transaction).options(db.lazyload('booked_by').all()
现在我得到了一个内部有用户对象的事务对象
用Json解析后,它看起来像:
[<Transaction 37 with User 1>, <Transaction 38 with User 2>, ...]
[
{
"id": 0,
"user_id": "string",
"booked_by_id": "string",
"booked_by": [
{
"id": "string",
"givenName": "string",
"familyName": "string",
"birthday": "string"
}
],
"product_id": "string",
"amount": 0,
"price": 0,
"timestamp": "2019-08-19T11:54:20.572Z"
}
]
我认为您正在寻找即时加载:这样您就可以查询事务并从那里访问用户。您需要在
事务中添加关系
,不过:@Wolph这是正确的方法!感谢您感谢这个想法,这种方式很有效,但是我必须重复每一项,如果我有很多事务,这不是很有效