我正在尝试将以下 SQL 语句“翻译”为 Flask 中的 SQLalchemy:
select subs.user_id, subs.magazine_id, article.title from article join subs on subs.magazine_id=article.magazine_id and subs.user_id=2;
它在 mysql shell 中工作正常,但是当我尝试使其在 plas 应用程序中工作时,我完全失败了。让我解释一下我想要做什么:我有三类不同的对象:用户、杂志和文章。用户可以订阅许多杂志。所有文章都属于一本独特的杂志。以下是我使用的模型:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column( db.String(64) )
subscriptions= db.relationship('Magazine', secondary=subs, backref=db.backref('subscribers', lazy='dynamic'), lazy='dynamic')
class Magazine(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
articles= db.relationship('Article', backref='magazine', lazy='dynamic')
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64))
abstract = db.Column(db.String(64))
magazine_id= db.Column(db.Integer, db.ForeignKey('magazine.id'))
subs = db.Table('subs',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('magazine_id', db.Integer, db.ForeignKey('magazine.id'))
)
subs 表用于保存订阅记录。我需要做的是,对于给定用户,检索她订阅的杂志的所有文章。
我知道如何让它在 python 中工作,假设 user1 是一个用户:
articles=[]
for m in user1.subscriptions:
articles+=m.articles.all()
但我需要从 SQLAlchemy 中执行此操作,因为我想过滤文章(已读/未读、发布日期、主题 ecc)并对结果进行分页。我可以使用帖子开头的语句从 mysql shell 执行此操作,但是当尝试从 SQLAlchemy 执行此操作时,我失败了:
user1.subscriptions.join(Article).filter(Article.magazine_id==id).all()
给出错误:
AttributeError: 'builtin_function_or_method' object has no attribute 'translate'
最佳答案
如果您正在寻找返回用户订阅的杂志中的所有文章的结果,请尝试从文章开始构建搜索。将 Magazine.subscribers 放在 join 子句中应该不需要在查询中直接引用 subs 表。
userArticles = db.session.query(Article).join(Article.magazine, Magazine.subscribers).filter(User.id==tbdID).all()
关于python - 从 SQL 语法到 SQLAlchemy 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205773/