add method for import data

This commit is contained in:
Thomas Peetz
2025-05-19 14:16:30 +02:00
parent 3197288eee
commit 20ed0b2f40
8 changed files with 387 additions and 8 deletions
+24 -4
View File
@@ -1,5 +1,5 @@
"""
import data from json file to MariaDB
import data from json file to PostgreSQL
"""
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
@@ -11,6 +11,7 @@ from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session
from db.models.base import Base
from db.models import registry
from psycopg2.errors import NotNullViolation
from config import get_logger
parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
@@ -62,11 +63,26 @@ def update_item(db: Session, import_data: Dict[AnyStr, Any], item: Any, dry_run:
existing_value = getattr(item, str(key))
if existing_value != value:
if not dry_run:
log.info(f"update {key}({existing_value}) with {value}")
setattr(model, str(key), value)
log.debug(f"update {key}({existing_value}) with {value}")
setattr(item, str(key), value)
db.add(item)
db.commit()
def item_import(db: Session, import_data: Dict[AnyStr, Any], dry_run: bool, log):
log.debug(f"import {import_data}")
if not dry_run:
log.info(f"model: {repr(model)} {import_data}")
try:
new_item = model()
new_item.import_dict(import_data)
log.info(f"new item: {new_item}")
db.add(new_item)
db.commit()
except NotNullViolation as notnull:
log.info(f"import failed: {notnull} {import_data}")
except Exception as error:
log.info(f"import failed: {error}")
if __name__ == '__main__':
logger = get_logger(args.verbose, "kontor")
@@ -78,7 +94,10 @@ if __name__ == '__main__':
if args.cleanup:
cleanup_database(db, logger, args.dry_run)
data = load_data(args.file, logger)
for tablename in data:
table_list: List = list(data.keys())
logger.info(f"Liste der Tabellen: {table_list}")
sorted_table_list: List = table_list
for tablename in sorted_table_list:
model = registry[tablename]
existing_items = db.query(model).all()
existing_ids = get_ids(existing_items)
@@ -92,6 +111,7 @@ if __name__ == '__main__':
existing_ids.remove(import_item['id'])
else:
logger.debug(f"import {import_item['id']}")
item_import(db, import_item, args.dry_run, logger)
logger.info(f"remaining items for {tablename}: {len(existing_ids)}")
logger.info('kontor.import finished')