Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在SqlAlchemy上排序嵌套的SQL SELECT_Python_Sql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 如何在SqlAlchemy上排序嵌套的SQL SELECT

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

我已经编写了一个SQL脚本,它应该在用户id之前获得X个条目,并根据注册日期在ordered db表上按registration_date desc排序

更具体地说,让我们假设以下是有序数据库中的一些条目:

    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弄混了。:/对不起!