| # 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) |