sqlite-utils schema now takes optional tables, closes #299

This commit is contained in:
Simon Willison 2021-07-24 15:08:36 -07:00
commit ab8d4aad0c
3 changed files with 55 additions and 17 deletions

View file

@ -525,6 +525,11 @@ The ``sqlite-utils schema`` command shows the full SQL schema for the database::
[name] TEXT
);
This will show the schema for every table and index in the database. To view the schema just for a specified subset of tables pass those as additional arguments::
$ sqlite-utils schema dogs.db dogs chickens
...
.. _cli_analyze_tables:
Analyzing tables

View file

@ -1550,15 +1550,21 @@ def indexes(
type=click.Path(file_okay=True, dir_okay=False, allow_dash=False),
required=True,
)
@click.argument("tables", nargs=-1, required=False)
@load_extension_option
def schema(
path,
tables,
load_extension,
):
"Show full schema for this database"
"Show full schema for this database or for specified tables"
db = sqlite_utils.Database(path)
_load_extensions(db, load_extension)
click.echo(db.schema)
if tables:
for table in tables:
click.echo(db[table].schema)
else:
click.echo(db.schema)
@cli.command()

View file

@ -2064,7 +2064,46 @@ def test_triggers(tmpdir, extra_args, expected):
assert result.output == expected
def test_schema(tmpdir):
@pytest.mark.parametrize(
"options,expected",
(
(
[],
(
"CREATE TABLE [dogs] (\n"
" [id] INTEGER,\n"
" [name] TEXT\n"
");\n"
"CREATE TABLE [chickens] (\n"
" [id] INTEGER,\n"
" [name] TEXT,\n"
" [breed] TEXT\n"
");\n"
"CREATE INDEX [idx_chickens_breed]\n"
" ON [chickens] ([breed]);\n"
),
),
(
["dogs"],
("CREATE TABLE [dogs] (\n" " [id] INTEGER,\n" " [name] TEXT\n" ")\n"),
),
(
["chickens", "dogs"],
(
"CREATE TABLE [chickens] (\n"
" [id] INTEGER,\n"
" [name] TEXT,\n"
" [breed] TEXT\n"
")\n"
"CREATE TABLE [dogs] (\n"
" [id] INTEGER,\n"
" [name] TEXT\n"
")\n"
),
),
),
)
def test_schema(tmpdir, options, expected):
db_path = str(tmpdir / "test.db")
db = Database(db_path)
db["dogs"].create({"id": int, "name": str})
@ -2072,23 +2111,11 @@ def test_schema(tmpdir):
db["chickens"].create_index(["breed"])
result = CliRunner().invoke(
cli.cli,
["schema", db_path],
["schema", db_path] + options,
catch_exceptions=False,
)
assert result.exit_code == 0
assert result.output == (
"CREATE TABLE [dogs] (\n"
" [id] INTEGER,\n"
" [name] TEXT\n"
");\n"
"CREATE TABLE [chickens] (\n"
" [id] INTEGER,\n"
" [name] TEXT,\n"
" [breed] TEXT\n"
");\n"
"CREATE INDEX [idx_chickens_breed]\n"
" ON [chickens] ([breed]);\n"
)
assert result.output == expected
def test_long_csv_column_value(tmpdir):