Python 将CTE查询转换为SQLAlchemy ORM

Python 将CTE查询转换为SQLAlchemy ORM,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,(这是今天早些时候删除的问题的改写版本。) 我正在使用SQLAlchemy ORM作为Flask应用程序的一部分,MySQL作为后端,我正在尝试编写一个查询来返回围绕特定条目的条目列表。虽然我在SQL中有一个工作查询,但我不确定如何在SQLA中编写它。这是一个非常复杂的例子,我找不到其他很多例子 现在假设一个只包含单词的非常简单的表: class Word(db.Model): __tablename__ = 'word' id = db.Column(db.Integer, p

(这是今天早些时候删除的问题的改写版本。)

我正在使用SQLAlchemy ORM作为Flask应用程序的一部分,MySQL作为后端,我正在尝试编写一个查询来返回围绕特定条目的条目列表。虽然我在SQL中有一个工作查询,但我不确定如何在SQLA中编写它。这是一个非常复杂的例子,我找不到其他很多例子

现在假设一个只包含单词的非常简单的表:

class Word(db.Model):
    __tablename__ = 'word'
    id = db.Column(db.Integer, primary_key=True)
    word = db.Column(db.String(100))
如果我想在给定单词(id为73)前后输入10个单词,那么执行我所需操作的SQL查询是:

WITH cte AS (SELECT id, word, ROW_NUMBER() OVER (ORDER BY word) AS rownumber FROM word)
SELECT * FROM cte
WHERE rownumber > (SELECT rownumber FROM cte WHERE cte.id = 73) - 10
AND rownumber < (SELECT rownumber FROM cte WHERE cte.id = 73) + 10
ORDER BY rownumber;

但是,即使这是正确的,我也不知道如何把它带入下一部分;我陷入了示例中的
别名
位。有人能给我一个正确的方向吗?

这可能不是最优雅的解决方案,但似乎对我有效:

engine=db.create\u引擎(sqlalchemy\u uri)
Base=声明性_Base()
类词(基):
__tablename=“so64359277”
id=db.Column(db.Integer,主键=True)
word=db.Column(db.String(100))
定义报告(自我):
返回f“”
Base.metadata.drop_all(引擎,checkfirst=True)
Base.metadata.create_all(引擎)
会话=会话生成器(绑定=引擎)
会话=会话()
#测试数据
word_objects=[]
对于x英寸[
“酒店”,
“查理”,
“阿尔法”,
“印度”,
“狐步舞”,
“回声”,
“好极了”,
“高尔夫”,
“三角洲”,
]:
word_objects.append(word(word=x))
session.add_all(word_对象)
session.commit()
#用id值显示测试数据
pprint(session.query(Word).all())
“”“控制台输出:
[,
,
,
,
,
,
,
,
]
"""
target_word=“Echo”
num\u context\u行=3
rowlist=session.query(
Word.id,
一字不差,
db.func.row_number().over(order_by=Word.Word).label(“rownum”),
).cte(“行列表”)
target_rownum=session.query(rowlist.c.rownum).filter(
rowlist.c.word==目标单词
)
选择_subset=session.query(rowlist.c.rownum,rowlist.c.id).filter(
db.and_(
(rowlist.c.rownum>=target_rownum.scalar()-num_context_rows),

(rowlist.c.rownum这可能不是最优雅的解决方案,但似乎对我有效:

engine=db.create\u引擎(sqlalchemy\u uri)
Base=声明性_Base()
类词(基):
__tablename=“so64359277”
id=db.Column(db.Integer,主键=True)
word=db.Column(db.String(100))
定义报告(自我):
返回f“”
Base.metadata.drop_all(引擎,checkfirst=True)
Base.metadata.create_all(引擎)
会话=会话生成器(绑定=引擎)
会话=会话()
#测试数据
word_objects=[]
对于x英寸[
“酒店”,
“查理”,
“阿尔法”,
“印度”,
“狐步舞”,
“回声”,
“好极了”,
“高尔夫”,
“三角洲”,
]:
word_objects.append(word(word=x))
session.add_all(word_对象)
session.commit()
#用id值显示测试数据
pprint(session.query(Word).all())
“”“控制台输出:
[,
,
,
,
,
,
,
,
]
"""
target_word=“Echo”
num\u context\u行=3
rowlist=session.query(
Word.id,
一字不差,
db.func.row_number().over(order_by=Word.Word).label(“rownum”),
).cte(“行列表”)
target_rownum=session.query(rowlist.c.rownum).filter(
rowlist.c.word==目标单词
)
选择_subset=session.query(rowlist.c.rownum,rowlist.c.id).filter(
db.and_(
(rowlist.c.rownum>=target_rownum.scalar()-num_context_rows),
(rowlist.c.rownum
id = 73
rowlist = db.session.query(Word.id, db.func.row_number()).filter(Word.id == id).order_by(Word.word).cte()