sqlite-utils duplicate command, closes #454, refs #449

Also made it so .duplicate() raises new NoTable exception rather than raising
an AssertionError if the source table does not exist.
This commit is contained in:
Simon Willison 2022-07-15 14:45:14 -07:00
commit c710ade644
7 changed files with 80 additions and 3 deletions

View file

@ -5,7 +5,7 @@ from datetime import datetime
import hashlib
import pathlib
import sqlite_utils
from sqlite_utils.db import AlterError, BadMultiValues, DescIndex
from sqlite_utils.db import AlterError, BadMultiValues, DescIndex, NoTable
from sqlite_utils.utils import maximize_csv_field_size_limit
from sqlite_utils import recipes
import textwrap
@ -1465,6 +1465,27 @@ def create_table(
)
@cli.command(name="duplicate")
@click.argument(
"path",
type=click.Path(file_okay=True, dir_okay=False, allow_dash=False),
required=True,
)
@click.argument("table")
@click.argument("new_table")
@load_extension_option
def create_table(path, table, new_table, load_extension):
"""
Create a duplicate of this table, copying across the schema and all row data.
"""
db = sqlite_utils.Database(path)
_load_extensions(db, load_extension)
try:
db[table].duplicate(new_table)
except NoTable:
raise click.ClickException('Table "{}" does not exist'.format(table))
@cli.command(name="drop-table")
@click.argument(
"path",

View file

@ -1,3 +1,4 @@
from ast import Not
from .utils import (
chunks,
hash_record,
@ -224,6 +225,11 @@ class NoObviousTable(Exception):
pass
class NoTable(Exception):
"Specified table does not exist"
pass
class BadPrimaryKey(Exception):
"Table does not have a single obvious primary key"
pass
@ -1482,7 +1488,8 @@ class Table(Queryable):
:param new_name: Name of the new table
"""
assert self.exists()
if not self.exists():
raise NoTable(f"Table {self.name} does not exist")
with self.db.conn:
sql = "CREATE TABLE [{new_table}] AS SELECT * FROM [{table}];".format(
new_table=new_name,