Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何联接两个表并将结果作为对象_Python_Sqlalchemy - Fatal编程技术网

Python 如何联接两个表并将结果作为对象

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'))

我想用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'))
    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这是正确的方法!感谢您感谢这个想法,这种方式很有效,但是我必须重复每一项,如果我有很多事务,这不是很有效