sqlite-utils rows --limit and --offset options, closes #381

This commit is contained in:
Simon Willison 2022-01-11 15:19:29 -08:00
commit 324ebc3130
4 changed files with 30 additions and 1 deletions

View file

@ -585,6 +585,8 @@ See :ref:`cli_rows`.
Options: Options:
-c, --column TEXT Columns to return -c, --column TEXT Columns to return
--limit INTEGER Number of rows to return - defaults to everything
--offset INTEGER SQL offset to use
--nl Output newline-delimited JSON --nl Output newline-delimited JSON
--arrays Output rows as arrays instead of objects --arrays Output rows as arrays instead of objects
--csv Output CSV --csv Output CSV

View file

@ -449,6 +449,8 @@ You can use the ``-c`` option to specify a subset of columns to return::
[{"age": 4, "name": "Cleo"}, [{"age": 4, "name": "Cleo"},
{"age": 2, "name": "Pancakes"}] {"age": 2, "name": "Pancakes"}]
Use ``--limit N`` to only return the first ``N`` rows. Use ``--offset N`` to return rows starting from the specified offset.
.. _cli_tables: .. _cli_tables:
Listing tables Listing tables

View file

@ -1723,6 +1723,16 @@ def search(
) )
@click.argument("dbtable") @click.argument("dbtable")
@click.option("-c", "--column", type=str, multiple=True, help="Columns to return") @click.option("-c", "--column", type=str, multiple=True, help="Columns to return")
@click.option(
"--limit",
type=int,
help="Number of rows to return - defaults to everything",
)
@click.option(
"--offset",
type=int,
help="SQL offset to use",
)
@output_options @output_options
@load_extension_option @load_extension_option
@click.pass_context @click.pass_context
@ -1731,6 +1741,8 @@ def rows(
path, path,
dbtable, dbtable,
column, column,
limit,
offset,
nl, nl,
arrays, arrays,
csv, csv,
@ -1745,10 +1757,15 @@ def rows(
columns = "*" columns = "*"
if column: if column:
columns = ", ".join("[{}]".format(c) for c in column) columns = ", ".join("[{}]".format(c) for c in column)
sql = "select {} from [{}]".format(columns, dbtable)
if limit:
sql += " limit {}".format(limit)
if offset:
sql += " offset {}".format(offset)
ctx.invoke( ctx.invoke(
query, query,
path=path, path=path,
sql="select {} from [{}]".format(columns, dbtable), sql=sql,
nl=nl, nl=nl,
arrays=arrays, arrays=arrays,
csv=csv, csv=csv,

View file

@ -851,6 +851,14 @@ def test_query_memory_does_not_create_file(tmpdir):
["--nl", "-c", "age", "-c", "name"], ["--nl", "-c", "age", "-c", "name"],
'{"age": 4, "name": "Cleo"}\n{"age": 2, "name": "Pancakes"}', '{"age": 4, "name": "Cleo"}\n{"age": 2, "name": "Pancakes"}',
), ),
(
["-c", "name", "--limit", "1"],
'[{"name": "Cleo"}]',
),
(
["-c", "name", "--limit", "1", "--offset", "1"],
'[{"name": "Pancakes"}]',
),
], ],
) )
def test_rows(db_path, args, expected): def test_rows(db_path, args, expected):