From 7a9a6363ffc1b4f1a9444a22999addabfa756c54 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 26 Aug 2022 21:10:20 -0700 Subject: [PATCH] sqlite-utils rows --order option, closes #469 --- docs/cli-reference.rst | 1 + docs/cli.rst | 2 ++ sqlite_utils/cli.py | 4 ++++ tests/test_cli.py | 9 +++++++++ 4 files changed, 16 insertions(+) diff --git a/docs/cli-reference.rst b/docs/cli-reference.rst index 2590595..c0f794c 100644 --- a/docs/cli-reference.rst +++ b/docs/cli-reference.rst @@ -713,6 +713,7 @@ See :ref:`cli_rows`. Options: -c, --column TEXT Columns to return --where TEXT Optional where clause + -o, --order TEXT Order by ('column' or 'column desc') -p, --param ... Named :parameters for where clause --limit INTEGER Number of rows to return - defaults to everything --offset INTEGER SQL offset to use diff --git a/docs/cli.rst b/docs/cli.rst index d2d1812..8cb2c56 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -467,6 +467,8 @@ Or pass named parameters using ``--where`` in combination with ``-p``:: $ sqlite-utils rows dogs.db dogs -c name --where 'name = :name' -p name Cleo [{"name": "Cleo"}] +You can define a sort order using ``--order column`` or ``--order 'column desc'``. + Use ``--limit N`` to only return the first ``N`` rows. Use ``--offset N`` to return rows starting from the specified offset. .. note:: diff --git a/sqlite_utils/cli.py b/sqlite_utils/cli.py index fe57fbe..43e76fa 100644 --- a/sqlite_utils/cli.py +++ b/sqlite_utils/cli.py @@ -1985,6 +1985,7 @@ def search( @click.argument("dbtable") @click.option("-c", "--column", type=str, multiple=True, help="Columns to return") @click.option("--where", help="Optional where clause") +@click.option("-o", "--order", type=str, help="Order by ('column' or 'column desc')") @click.option( "-p", "--param", @@ -2011,6 +2012,7 @@ def rows( dbtable, column, where, + order, param, limit, offset, @@ -2037,6 +2039,8 @@ def rows( sql = "select {} from [{}]".format(columns, dbtable) if where: sql += " where " + where + if order: + sql += " order by " + order if limit: sql += " limit {}".format(limit) if offset: diff --git a/tests/test_cli.py b/tests/test_cli.py index 061a578..4eadb88 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -881,6 +881,15 @@ def test_query_memory_does_not_create_file(tmpdir): ["-c", "name", "--where", "id = :id", "--param", "id", "1"], '[{"name": "Cleo"}]', ), + # --order + ( + ["-c", "id", "--order", "id desc", "--limit", "1"], + '[{"id": 2}]', + ), + ( + ["-c", "id", "--order", "id", "--limit", "1"], + '[{"id": 1}]', + ), ], ) def test_rows(db_path, args, expected):