Python 如何在SqlAlchemy上排序嵌套的SQL SELECT
我已经编写了一个SQL脚本,它应该在用户id之前获得X个条目,并根据注册日期在ordered db表上按registration_date desc排序 更具体地说,让我们假设以下是有序数据库中的一些条目:Python 如何在SqlAlchemy上排序嵌套的SQL SELECT,python,sql,sqlalchemy,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask Sqlalchemy,我已经编写了一个SQL脚本,它应该在用户id之前获得X个条目,并根据注册日期在ordered db表上按registration_date desc排序 更具体地说,让我们假设以下是有序数据库中的一些条目: id | Name | Email | registration_data 3939 | Barbara Hayes | barbara.hayes@exam
id | Name | Email | registration_data
3939 | Barbara Hayes | barbara.hayes@example.com | 2019-09-15T23:39:26.910Z
689 | Noémie Harris | noemie.harris@example.com | 2019-09-14T21:39:15.641Z
2529 | Andrea Iglesias | andrea.iglesias@example.com | 2019-09-13T02:59:08.821Z
3890 | Villads Andersen | villads.andersen@example.com | 2019-09-12T06:29:48.708Z
3685 | Houssine Van Sabben | houssine.vansabben@example.com | 2019-09-12T02:27:08.396Z
我想让用户超过id 3890。因此,查询应该返回
689 | Noémie Harris | noemie.harris@example.com | 2019-09-14T21:39:15.641Z
2529 | Andrea Iglesias | andrea.iglesias@example.com | 2019-09-13T02:59:08.821Z
我编写的原始SQL是:
SELECT * from (
SELECT id, name, email, registration_date FROM public.users
WHERE users.registration_date > (SELECT registration_date FROM users WHERE id = 3890)
order by registration_date
limit 2 )
as a
order by registration_date desc
看
我试图实现SqlAlchemy代码,但没有成功。我相信我在子查询上犯了一个错误。这就是我到目前为止所做的
registration_date_min = db.query(User.registration_date) \
.order_by(User.registration_date) \
.filter(User.id == ending_before).first()
users_list = db.query(User) \
.filter(User.registration_date > registration_date_min) \
.order_by('registration_date').limit(limit).subquery('users_list')
return users_list.order_by(desc('registration_date'))
p.s前面的结尾表示用户id,如示例中的3890。
任何关于SqlAlchemy部分的想法都会非常有用 首先,您的注册日期最小查询已经执行;这里有一行和一列。移除第一个呼叫;它执行SELECT并返回第一行
当您通过主键进行选择时,只会有一行,您不需要对其进行排序。只需使用:
注册\日期\最小值=db.queryUser.registration\日期.filter
User.id==在之前结束
它现在是一个查询对象,可以直接用于比较:
用户列表=
db.queryUser
.filterUser.registration\u date>registration\u date\u min
.order\u byUser.registration\u date
.limitlimit
然后,您可以从该查询应用最终排序:
返回用户\u列表。从\u self.order\u byUser.registration\u date.desc
这将在SQLite上生成以下SQL,其他方言可能有所不同:
选择anon_1.users_id作为anon_1_users_id,anon_1.users_name作为anon_1_users_name,anon_1.users_email作为anon_1_users_email,anon_1.users_注册日期作为anon_1_users_注册日期
从中选择users.id作为users\u id,users.name作为users\u name,users.email作为users\u email,users.registration\u date作为users\u registration\u date
来自用户
其中users.registration\u date>选择users.registration\u date作为users\u registration\u date
来自用户
其中users.id=?按用户排序。注册日期
限度抵消作为anon_1订单由anon_1.users_registration_date DESC
如果我将以下模型与_repr__一起使用:
类Userdb.Model:
__tablename\uu=用户
id=db.Columndb.Integer,主键=True
name=db.Columndb.String
email=db.Columndb.String
注册日期=db.Columndb.DateTime
定义报告自我:
返回f
并打印我得到的查询结果实例:
首先,您的注册日期查询已经执行;这里有一行和一列。移除第一个呼叫;它执行SELECT并返回第一行
当您通过主键进行选择时,只会有一行,您不需要对其进行排序。只需使用:
注册\日期\最小值=db.queryUser.registration\日期.filter
User.id==在之前结束
它现在是一个查询对象,可以直接用于比较:
用户列表=
db.queryUser
.filterUser.registration\u date>registration\u date\u min
.order\u byUser.registration\u date
.limitlimit
然后,您可以从该查询应用最终排序:
返回用户\u列表。从\u self.order\u byUser.registration\u date.desc
这将在SQLite上生成以下SQL,其他方言可能有所不同:
选择anon_1.users_id作为anon_1_users_id,anon_1.users_name作为anon_1_users_name,anon_1.users_email作为anon_1_users_email,anon_1.users_注册日期作为anon_1_users_注册日期
从中选择users.id作为users\u id,users.name作为users\u name,users.email作为users\u email,users.registration\u date作为users\u registration\u date
来自用户
其中users.registration\u date>选择users.registration\u date作为users\u registration\u date
来自用户
其中users.id=?按用户排序。注册日期
限度抵消作为anon_1订单由anon_1.users_registration_date DESC
如果我将以下模型与_repr__一起使用:
类Userdb.Model:
__tablename\uu=用户
id=db.Columndb.Integer,主键=True
name=db.Columndb.String
email=db.Columndb.String
注册日期=db.Columndb.DateTime
定义报告自我:
返回f
并打印我得到的查询结果实例:
真的快吗?@MartijnPieters表的示例只是按日期描述排序的,这就是为什么要指定具体日期。说实话,我对你所说的样本日期有点困惑,这就是为什么我发布了代码共享,以便在那里更快地讨论它。从好的方面来说,我尝试了你的解决方案,它成功了!现在就用手机。我将查询放到数据库中,发现一定是把用户ID弄混了。:/对不起!真的快吗?@MartijnPieters表的示例只是按日期描述排序的,这就是为什么要指定具体日期。说实话,我对你所说的样本日期有点困惑,这就是为什么我发布了代码共享,以便在那里更快地讨论它。从好的方面来说,我尝试了你的解决方案,它成功了!现在就用手机。 我将查询放到数据库中,发现一定是把用户ID弄混了。:/对不起!