blob: f1ebe9b4a6158d8d99deee421218659019951c80 [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""
Database commands for Paimon CLI.
This module provides database-related commands for the CLI.
"""
import json
import sys
def cmd_db_get(args):
"""
Execute the 'db get' command.
Gets and displays database information in JSON format.
Args:
args: Parsed command line arguments.
"""
from pypaimon.cli.cli import load_catalog_config, create_catalog
config = load_catalog_config(args.config)
catalog = create_catalog(config)
database_name = args.database
try:
database = catalog.get_database(database_name)
except Exception as e:
print(f"Error: Failed to get database '{database_name}': {e}", file=sys.stderr)
sys.exit(1)
result = {
"name": database.name,
"options": database.options if database.options else {},
}
if database.comment is not None:
result["comment"] = database.comment
print(json.dumps(result, indent=2, ensure_ascii=False))
def cmd_db_create(args):
"""
Execute the 'db create' command.
Creates a new database.
Args:
args: Parsed command line arguments.
"""
from pypaimon.cli.cli import load_catalog_config, create_catalog
config = load_catalog_config(args.config)
catalog = create_catalog(config)
database_name = args.database
ignore_if_exists = args.ignore_if_exists
# Parse properties if provided
properties = None
if args.properties:
try:
properties = json.loads(args.properties)
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON format for properties: {e}", file=sys.stderr)
sys.exit(1)
try:
catalog.create_database(database_name, ignore_if_exists, properties)
print(f"Database '{database_name}' created successfully.")
except Exception as e:
print(f"Error: Failed to create database '{database_name}': {e}", file=sys.stderr)
sys.exit(1)
def cmd_db_drop(args):
"""
Execute the 'db drop' command.
Drops an existing database.
Args:
args: Parsed command line arguments.
"""
from pypaimon.cli.cli import load_catalog_config, create_catalog
config = load_catalog_config(args.config)
catalog = create_catalog(config)
database_name = args.database
ignore_if_not_exists = args.ignore_if_not_exists
cascade = args.cascade
try:
catalog.drop_database(database_name, ignore_if_not_exists, cascade)
print(f"Database '{database_name}' dropped successfully.")
except Exception as e:
print(f"Error: Failed to drop database '{database_name}': {e}", file=sys.stderr)
sys.exit(1)
def cmd_db_alter(args):
"""
Execute the 'db alter' command.
Alters database properties by setting or removing properties.
Args:
args: Parsed command line arguments.
"""
from pypaimon.cli.cli import load_catalog_config, create_catalog
from pypaimon.catalog.rest.property_change import PropertyChange
config = load_catalog_config(args.config)
catalog = create_catalog(config)
database_name = args.database
changes = []
# Parse set properties
if args.set:
try:
set_properties = json.loads(args.set)
if not isinstance(set_properties, dict):
print("Error: --set value must be a JSON object.", file=sys.stderr)
sys.exit(1)
for key, value in set_properties.items():
changes.append(PropertyChange.set_property(key, str(value)))
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON format for --set: {e}", file=sys.stderr)
sys.exit(1)
# Parse remove properties
if args.remove:
for key in args.remove:
changes.append(PropertyChange.remove_property(key))
if not changes:
print("Error: No changes specified. Use --set or --remove.", file=sys.stderr)
sys.exit(1)
try:
catalog.alter_database(database_name, changes)
print(f"Database '{database_name}' altered successfully.")
except NotImplementedError as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f"Error: Failed to alter database '{database_name}': {e}", file=sys.stderr)
sys.exit(1)
def cmd_db_list_tables(args):
"""
Execute the 'db list-tables' command.
Lists all tables in a database.
Args:
args: Parsed command line arguments.
"""
from pypaimon.cli.cli import load_catalog_config, create_catalog
config = load_catalog_config(args.config)
catalog = create_catalog(config)
database_name = args.database
try:
tables = catalog.list_tables(database_name)
except Exception as e:
print(f"Error: Failed to list tables in database '{database_name}': {e}", file=sys.stderr)
sys.exit(1)
if not tables:
print(f"No tables found in database '{database_name}'.")
else:
for table_name in tables:
print(table_name)
def add_db_subcommands(db_parser):
"""
Add database subcommands to the parser.
Args:
db_parser: The db subparser to add commands to.
"""
db_subparsers = db_parser.add_subparsers(dest='db_command', help='Database commands')
# db get command
get_parser = db_subparsers.add_parser('get', help='Get database information')
get_parser.add_argument(
'database',
help='Database name'
)
get_parser.set_defaults(func=cmd_db_get)
# db create command
create_parser = db_subparsers.add_parser('create', help='Create a new database')
create_parser.add_argument(
'database',
help='Database name'
)
create_parser.add_argument(
'--properties', '-p',
default=None,
help='Database properties as JSON string (e.g., \'{"key1": "value1"}\')'
)
create_parser.add_argument(
'--ignore-if-exists', '-i',
action='store_true',
help='Do not raise error if database already exists'
)
create_parser.set_defaults(func=cmd_db_create)
# db drop command
drop_parser = db_subparsers.add_parser('drop', help='Drop a database')
drop_parser.add_argument(
'database',
help='Database name'
)
drop_parser.add_argument(
'--ignore-if-not-exists', '-i',
action='store_true',
help='Do not raise error if database does not exist'
)
drop_parser.add_argument(
'--cascade',
action='store_true',
help='Drop all tables in the database before dropping it'
)
drop_parser.set_defaults(func=cmd_db_drop)
# db alter command
alter_parser = db_subparsers.add_parser('alter', help='Alter database properties')
alter_parser.add_argument(
'database',
help='Database name'
)
alter_parser.add_argument(
'--set', '-s',
default=None,
help='Properties to set as JSON string (e.g., \'{"key1": "value1"}\')'
)
alter_parser.add_argument(
'--remove', '-r',
nargs='+',
default=None,
help='Property keys to remove'
)
alter_parser.set_defaults(func=cmd_db_alter)
# db list-tables command
list_tables_parser = db_subparsers.add_parser('list-tables', help='List all tables in a database')
list_tables_parser.add_argument(
'database',
help='Database name'
)
list_tables_parser.set_defaults(func=cmd_db_list_tables)