From aa71e359bbd5133a5850630b86fe90d93882f388 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 26 May 2025 09:48:55 +0200 Subject: [PATCH] update --- .gitignore | 2 + sqlite/create_db.py | 3 +- sqlite/delete.py | 232 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 sqlite/delete.py diff --git a/.gitignore b/.gitignore index 6041bda..2b10a80 100755 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,6 @@ NPM/data/*.txt NPM/data/*.json *.lock sqlite/*.db +sqlite/*.sql + tests/ \ No newline at end of file diff --git a/sqlite/create_db.py b/sqlite/create_db.py index b10e2ac..a27842c 100755 --- a/sqlite/create_db.py +++ b/sqlite/create_db.py @@ -89,7 +89,8 @@ CREATE TABLE IF NOT EXISTS data_envea ( h2s REAL, nh3 REAL, co REAL, - o3 REAL + o3 REAL, + so2 REAL ) """) diff --git a/sqlite/delete.py b/sqlite/delete.py new file mode 100644 index 0000000..0b6f0a2 --- /dev/null +++ b/sqlite/delete.py @@ -0,0 +1,232 @@ +''' + ____ ___ _ _ _ + / ___| / _ \| | (_) |_ ___ + \___ \| | | | | | | __/ _ \ + ___) | |_| | |___| | || __/ + |____/ \__\_\_____|_|\__\___| + +Script to delete a table from sqlite database +/usr/bin/python3 /var/www/nebuleair_pro_4g/sqlite/delete_table.py table_name [--confirm] + +Available tables are: +data_NPM +data_NPM_5channels +data_BME280 +data_envea +timestamp_table +data_MPPT +data_WIND +modem_status +config_table +envea_sondes_table + +Examples: +# Will ask for confirmation +python3 delete_table.py data_NPM + +# Skip confirmation prompt +python3 delete_table.py data_NPM --confirm + +# List all tables +python3 delete_table.py --list +''' + +import sqlite3 +import sys +import os +from datetime import datetime + +def list_tables(cursor): + """List all tables in the database""" + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name") + tables = cursor.fetchall() + + print("\nšŸ“‹ Available tables:") + print("-" * 40) + for table in tables: + # Get row count for each table + cursor.execute(f"SELECT COUNT(*) FROM {table[0]}") + count = cursor.fetchone()[0] + print(f" {table[0]} ({count} rows)") + print("-" * 40) + +def get_table_info(cursor, table_name): + """Get information about a table""" + try: + # Check if table exists + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name=?", (table_name,)) + if not cursor.fetchone(): + return None + + # Get row count + cursor.execute(f"SELECT COUNT(*) FROM {table_name}") + row_count = cursor.fetchone()[0] + + # Get table schema + cursor.execute(f"PRAGMA table_info({table_name})") + columns = cursor.fetchall() + + return { + 'row_count': row_count, + 'columns': columns + } + except sqlite3.Error as e: + print(f"Error getting table info: {e}") + return None + +def backup_table(cursor, table_name, db_path): + """Create a backup of the table before deletion""" + try: + backup_dir = os.path.dirname(db_path) + timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') + backup_file = os.path.join(backup_dir, f"{table_name}_backup_{timestamp}.sql") + + # Get table schema + cursor.execute(f"SELECT sql FROM sqlite_master WHERE type='table' AND name=?", (table_name,)) + create_sql = cursor.fetchone() + + if create_sql: + with open(backup_file, 'w') as f: + # Write table creation SQL + f.write(f"-- Backup of table {table_name} created on {datetime.now()}\n") + f.write(f"{create_sql[0]};\n\n") + + # Write data + cursor.execute(f"SELECT * FROM {table_name}") + rows = cursor.fetchall() + + if rows: + # Get column names + cursor.execute(f"PRAGMA table_info({table_name})") + columns = [col[1] for col in cursor.fetchall()] + + f.write(f"-- Data for table {table_name}\n") + for row in rows: + values = [] + for value in row: + if value is None: + values.append('NULL') + elif isinstance(value, str): + escaped_value = value.replace("'", "''") + values.append(f"'{escaped_value}'") + else: + values.append(str(value)) + + f.write(f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({', '.join(values)});\n") + + print(f"āœ“ Table backed up to: {backup_file}") + return backup_file + except Exception as e: + print(f"āš ļø Backup failed: {e}") + return None + +def delete_table(cursor, table_name, create_backup=True, db_path=None): + """Delete a table from the database""" + + # Get table info first + table_info = get_table_info(cursor, table_name) + if not table_info: + print(f"āŒ Table '{table_name}' does not exist!") + return False + + print(f"\nšŸ“Š Table Information:") + print(f" Name: {table_name}") + print(f" Rows: {table_info['row_count']}") + print(f" Columns: {len(table_info['columns'])}") + + # Create backup if requested + backup_file = None + if create_backup and db_path: + print(f"\nšŸ’¾ Creating backup...") + backup_file = backup_table(cursor, table_name, db_path) + + try: + # Delete the table + cursor.execute(f"DROP TABLE {table_name}") + print(f"\nāœ… Table '{table_name}' deleted successfully!") + + if backup_file: + print(f" Backup saved: {backup_file}") + + return True + + except sqlite3.Error as e: + print(f"āŒ Error deleting table: {e}") + return False + +def main(): + if len(sys.argv) < 2: + print("Usage: python3 delete_table.py [--confirm] [--no-backup]") + print(" python3 delete_table.py --list") + sys.exit(1) + + db_path = "/var/www/nebuleair_pro_4g/sqlite/sensors.db" + + # Check if database exists + if not os.path.exists(db_path): + print(f"āŒ Database not found: {db_path}") + sys.exit(1) + + # Parse arguments + args = sys.argv[1:] + + if '--list' in args: + # List all tables + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + list_tables(cursor) + conn.close() + return + + table_name = args[0] + skip_confirmation = '--confirm' in args + create_backup = '--no-backup' not in args + + try: + # Connect to database + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + + # List available tables first + list_tables(cursor) + + # Check if table exists + table_info = get_table_info(cursor, table_name) + if not table_info: + print(f"\nāŒ Table '{table_name}' does not exist!") + conn.close() + sys.exit(1) + + # Confirmation prompt + if not skip_confirmation: + print(f"\nāš ļø WARNING: You are about to delete table '{table_name}'") + print(f" This table contains {table_info['row_count']} rows") + if create_backup: + print(f" A backup will be created before deletion") + else: + print(f" NO BACKUP will be created (--no-backup flag used)") + + response = input(f"\nAre you sure you want to delete '{table_name}'? (yes/no): ").lower().strip() + + if response not in ['yes', 'y']: + print("āŒ Operation cancelled") + conn.close() + sys.exit(0) + + # Perform deletion + success = delete_table(cursor, table_name, create_backup, db_path) + + if success: + conn.commit() + print(f"\nšŸŽ‰ Operation completed successfully!") + else: + print(f"\nāŒ Operation failed!") + + conn.close() + + except Exception as e: + print(f"āŒ Error: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file