【问题标题】:how to perform join query with sql alchemy with postgres如何使用 sql alchemy 和 postgres 执行连接查询
【发布时间】:2017-11-06 01:15:04
【问题描述】:

ExpenseList 表有两个外键,我想从这个类别中获取相应类别的费用列表。目前它仅在我应用以下查询时返回 category_id:

query = ExpenseList.query.filter_by(user_id=6)
return make_response(jsonify([i.serialize for i in query.all()])),200

它的返回响应如下:

[
{
    "category": 3,
    "created_on": "Sun, 05 Nov 2017 09:40:19 GMT",
    "money_spent": "50",
    "name": "DVD"
},
{
    "category": 3,
    "created_on": "Sun, 05 Nov 2017 09:40:39 GMT",
    "money_spent": "100",
    "name": "Movie"
}
]

模型架构是

class ExpenseList(db.Model):
    __tablename__ = 'expense_list'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(500), unique=True, nullable=False)
    money_spent = db.Column(db.String(500), nullable=False)
    category_id = db.Column(db.Integer, db.ForeignKey('category_list.id'))
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    is_recurring = db.Column(db.Boolean,nullable=False, default=False)
    created_on = db.Column(db.DateTime, nullable=False)

    @property
    def serialize(self):
        return {
            'name' : self.name,
            'money_spent' : self.money_spent,
            'category' : self.category_id,
            'created_on' : self.created_on
         }


class CategoryList(db.Model):
    __tablename__ = 'category_list'

    id = db.Column(db.Integer,primary_key = True, autoincrement=True)
    name = db.Column(db.String(500), unique=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    created_on = db.Column(db.DateTime, nullable=False)

如何在响应对象中获取类别名称而不是 category_id,我也尝试过 backrefs、lazy 等,但不知道我哪里出错了。

【问题讨论】:

  • 我读了那个问题,但没有找到完美的答案
  • query(ExpenseList).join(CategoryList).f‌​ilter_by(user_id=6) 这有帮助吗?我无法尝试任何东西,所以这可能是我所能提供的。也可以试试SQLAlchemy filter query by related object
  • 是的,这行得通,但这实际上根本不做连接,它返回一个元组中的行对象。在这种情况下,它会返回 [(, ,),...]

标签: postgresql sqlalchemy flask-sqlalchemy


【解决方案1】:

这是你想要的加入

query(ExpenseList.name.label('expense_name'),
    ExpenseList.money_spent,
    CategoryList.name.label('category_name'),
    ExpenseList.created_on)\
.join(CategoryList, ExpenseList.category_id == CategoryList.id)\
.filter_by(ExpenseList.user_id=6)

您的 CategoryList 模型中令人担忧的部分是:

name = db.Column(db.String(500), unique=True, autoincrement=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-07
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多