From 20f29d88fa4e41b25cdbba6ca2b4c9b4ca41b62a Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Fri, 18 Apr 2025 22:55:40 +0200 Subject: [PATCH] add script to copy from json to mariadb --- scripts/export.py | 4 +-- scripts/import.py | 2 +- scripts/json_to_mariadb.py | 60 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 scripts/json_to_mariadb.py diff --git a/scripts/export.py b/scripts/export.py index 0b730bd..13ccc93 100644 --- a/scripts/export.py +++ b/scripts/export.py @@ -22,7 +22,7 @@ args = parser.parse_args() if __name__ == '__main__': logger = get_logger(args.verbose, args.config) - logger.info('kontor.import started') + logger.info('kontor.export started') dirs = PlatformDirs(args.config) database_config = Path(dirs.user_config_dir, 'database-config.yaml') with open(database_config, 'rt') as f: @@ -39,4 +39,4 @@ if __name__ == '__main__': __session__ = sessionmaker(bind=engine) kontor_db = KontorDB(engine, logger) kontor_db.export_db("JSON", args.file) - logger.info('kontor.import finished') + logger.info('kontor.export finished') diff --git a/scripts/import.py b/scripts/import.py index 1de2fe4..f50d82d 100644 --- a/scripts/import.py +++ b/scripts/import.py @@ -38,5 +38,5 @@ if __name__ == '__main__': Base.metadata.create_all(bind=engine, checkfirst=True) __session__ = sessionmaker(bind=engine) kontor_db = KontorDB(engine, logger) - kontor_db.export_db(args.file) + kontor_db.import_db(args.file) logger.info('kontor.import finished') diff --git a/scripts/json_to_mariadb.py b/scripts/json_to_mariadb.py new file mode 100644 index 0000000..c1064c9 --- /dev/null +++ b/scripts/json_to_mariadb.py @@ -0,0 +1,60 @@ +""" +copy data from SQLite to MariaDB +""" +from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter +from pathlib import Path +from typing import Dict +from config import get_logger, get_database_cursors, get_meta_data, get_scripts +import mariadb +import json + +parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) +parser.add_argument('--verbose', '-v', action='count', default=0) +parser.add_argument('--config', '-c', default='kontor-docker') +parser.add_argument('--file', '-f', default='~/.sync/media/data.json') +args = parser.parse_args() + +def copy_data(mariadb_conn, data_file: Path, log): + mariadb_cursor = mariadb_conn.cursor() + result = {} + import_file = Path(data_file) + if not import_file.exists(): + log.info(f"File {data_file} does not exist. Do nothing.") + return + log.info("read json file") + with open(data_file, 'r') as json_file: + json_load = json.load(json_file) + for table in json_load: + log.info(f"{table}: {len(json_load[table])}") + # result[table] = import_table(table, json_load[table]) + truncate_statement = 'TRUNCATE {}'.format(table) + #log.info(f"truncate: {truncate_statement}") + mariadb_cursor.execute("SET FOREIGN_KEY_CHECKS = 0") + mariadb_cursor.execute(truncate_statement) + items = json_load[table] + for item in items: + #log.info(f"item: {item}") + values = [] + columns = [] + for (key, value) in item.items(): + columns.append(key) + values.append(value) + row = tuple(values) + #log.info(f"values: {row}") + insert_statement = 'INSERT INTO {}({}) VALUES({})'.format(table, ', '.join(columns), ', '.join(['?']*len(columns))) + #log.info(f"statement: {insert_statement}") + mariadb_cursor.execute(insert_statement, row) + try: + mariadb_conn.commit() + except mariadb.Error as error: + log.info('insert failed with %s', error) + + +if __name__ == '__main__': + logger = get_logger(args.verbose, args.config) + logger.info('kontor.json_to_mariadb started') + _, m_conn = get_database_cursors(logger, args.config) + copy_data(m_conn, args.file, logger) + m_conn.close() + logger.info('kontor.json_to_mariadb finished') +