大家。我在使用FLask和SQLAlchemy时遇到了一些问题。
我有模特:
tag_article_table = db.Table('tag_article_table',
db.Column('article_id', db.Integer, db.ForeignKey('article.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
content = db.Column(db.Text)
cover_image = db.Column(db.String)
url_title = db.Column(db.String)
seo_keyword = db.Column(db.String)
seo_description = db.Column(db.Text)
author = db.Column(db.String)
created_date = db.Column(db.Date)
views_count = db.Column(db.Integer)
comments_count = db.Column(db.Integer)
catalog_id = db.Column(db.Integer, db.ForeignKey('channel.id'))
tags = db.relationship("Tag", secondary=tag_article_table, backref="articles")
class Channel(db.Model):
__tablename__ = 'channel'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
alias = db.Column(db.String)
articles_count = db.Column(db.Integer)
parent_id = db.Column(db.Integer, db.ForeignKey('channel.id'))
articles = db.relationship('Article', backref='catalog')
catalogs = db.relationship('Channel', backref=db.backref('parent', remote_side=[id]))
class Tag(db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
alias = db.Column(db.String)
articles_count = db.Column(db.Integer)
首先我想要获取所有的artciels,所以我写这样的代码:
articles = self.query.options(joinedload('catalog'),joinedload('tags')).all()
它回应了sql脚本:
SELECT
article.id AS article_id,
article.title AS article_title,
article.content AS article_content,
article.cover_image AS article_cover_image,
article.url_title AS article_url_title,
article.seo_keyword AS article_seo_keyword,
article.seo_description AS article_seo_description,
article.author AS article_author,
article.created_date AS article_created_date,
article.views_count AS article_views_count,
article.comments_count AS article_comments_count,
article.catalog_id AS article_catalog_id,
tag_1.id AS tag_1_id,
tag_1.name AS tag_1_name,
tag_1.alias AS tag_1_alias,
tag_1.articles_count AS tag_1_articles_count,
channel_1.id AS channel_1_id,
channel_1.name AS channel_1_name,
channel_1.alias AS channel_1_alias,
channel_1.articles_count AS channel_1_articles_count,
channel_1.parent_id AS channel_1_parent_id
FROM
article
LEFT OUTER JOIN
tag_article_table AS tag_article_table_1 ON article.id = tag_article_table_1.article_id
LEFT OUTER JOIN
tag AS tag_1 ON tag_1.id = tag_article_table_1.tag_id
LEFT OUTER JOIN
channel AS channel_1 ON channel_1.id = article.catalog_id
但是当我尝试将OFFSET和LIMIT添加到代码中时:
articles = self.query.options(joinedload('catalog'),joinedload('tags')).offset(10).limit(10).all()
sql脚本变成:
SELECT
anon_1.article_id AS anon_1_article_id,
anon_1.article_title AS anon_1_article_title,
anon_1.article_content AS anon_1_article_content,
anon_1.article_cover_image AS anon_1_article_cover_image,
anon_1.article_url_title AS anon_1_article_url_title,
anon_1.article_seo_keyword AS anon_1_article_seo_keyword,
anon_1.article_seo_description AS anon_1_article_seo_description,
anon_1.article_author AS anon_1_article_author,
anon_1.article_created_date AS anon_1_article_created_date,
anon_1.article_views_count AS anon_1_article_views_count,
anon_1.article_comments_count AS anon_1_article_comments_count,
anon_1.article_catalog_id AS anon_1_article_catalog_id,
tag_1.id AS tag_1_id,
tag_1.name AS tag_1_name,
tag_1.alias AS tag_1_alias,
tag_1.articles_count AS tag_1_articles_count,
channel_1.id AS channel_1_id,
channel_1.name AS channel_1_name,
channel_1.alias AS channel_1_alias,
channel_1.articles_count AS channel_1_articles_count,
channel_1.parent_id AS channel_1_parent_id
FROM (
SELECT
article.id AS article_id,
article.title AS article_title,
article.content AS article_content,
article.cover_image AS article_cover_image,
article.url_title AS article_url_title,
article.seo_keyword AS article_seo_keyword,
article.seo_description AS article_seo_description,
article.author AS article_author,
article.created_date AS article_created_date,
article.views_count AS article_views_count,
article.comments_count AS article_comments_count,
article.catalog_id AS article_catalog_id
FROM article
LIMIT
%(param_1)s OFFSET %(param_2)s) AS anon_1
LEFT OUTER JOIN
tag_article_table AS tag_article_table_1 ON anon_1.article_id = tag_article_table_1.article_id
LEFT OUTER JOIN
tag AS tag_1 ON tag_1.id = tag_article_table_1.tag_id
LEFT OUTER JOIN
channel AS channel_1 ON channel_1.id = anon_1.article_catalog_id
)
其中有一个额外的子查询,除了添加LIMIT和OFFSET之外我什么都没做。
我对它感到困惑。这是一个sqlalchemy bug还是错误?