![](/img/trans.png)
[英]SQLAlchemy ORM: SELECT specific columns with multiple JOIN and WHERE clause
[英]SQLAlchemy select multiple columns like inner join
我有用户、公司及其文章的数据库。 多个用户可以在一个公司内部,并且用户可以创建文章。 现在,我尝试让用户可以查看他们公司的文章。 我 select 所有文章都按 company_id 并将用户名附加到 add_column,但结果我有重复的记录:
[(<Article 1>, <User 1>), (<Article 1>, <User 2>), (<Article 2>, <User 1>), (<Article 2>, <User 2>)]
需要是这样的:
[(<Article 1>, <User 1>), (<Article 2>, <User 2>)] - this articles with one article_company_id
我的代码:
user_id = current_user.id
# Here i get company_id of current user
company_id = User.query.filter_by(id=user_id).first().company_id
# Here i want to load all articles for company
article_list = Article.query.add_entity(User).filter_by(article_company_id=company_id).all()
数据库模型:
class User(UserMixin, db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(100), unique=True)
password = db.Column(db.String(100))
name = db.Column(db.String(1000))
company_id = db.Column(db.String(100))
created = db.Column(db.String(100))
rights_id = db.Column(db.String(100))
gravatar = db.Column(db.String(100))
class Company(db.Model):
__tablename__ = 'company'
id = db.Column(db.Integer, primary_key=True)
company_admin_id = db.Column(db.Integer)
company_name = db.Column(db.String(100))
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True)
article_owner_id = db.Column(db.Integer, ForeignKey('user.id'))
article_company_id = db.Column(db.Integer, ForeignKey('company.id'))
article_creation_date = db.Column(db.String(100))
article_status = db.Column(db.String(100))
article_data = db.Column(db.JSON(100))
article_name = db.Column(db.String(100))
正如您在屏幕截图中看到的那样,我有 2 篇文章,其中有一篇 article_company_id,因此我想从用户表中获取这两条记录,但它们的所有者名称。 我怎样才能做到这一点?
仅在article_company_id
上使用过滤器的问题在于,它不会过滤掉用户,要么您在过滤器中包含user_id
,要么您可以在此处使用连接,并且 select 仅用于您需要的列,
例如
res = (
db.session.query(Article.article_name,
User.name)
.join(User, Company)
.all()
)
print(res[0].name)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.