SciProgCentre / jinr-database-tools

Tools for load data to database
Apache License 2.0
1 stars 1 forks source link

jinr-database-loader-gui and jinr-database-loader not found #1

Open kgertsenberger opened 2 years ago

kgertsenberger commented 2 years ago

Steps: ~/tmp$ git clone https://github.com/mipt-npm/jinr-database-tools.git Cloning into 'jinr-database-tools'... remote: Enumerating objects: 131, done. remote: Counting objects: 100% (131/131), done. remote: Compressing objects: 100% (103/103), done. remote: Total 131 (delta 42), reused 111 (delta 25), pack-reused 0 Receiving objects: 100% (131/131), 1.57 MiB | 5.27 MiB/s, done. Resolving deltas: 100% (42/42), done.

~/tmp$ cd jinr-database-tools

~/tmp/jinr-database-tools$ pip install -e . Defaulting to user installation because normal site-packages is not writeable Obtaining file:///home/soul/tmp/jinr-database-tools Preparing metadata (setup.py) ... done Requirement already satisfied: PySide2 in /home/soul/.local/lib/python3.10/site-packages (from jinrdatabaseloader==0.0.1) (5.15.2.1) Requirement already satisfied: SQLAlchemy in /home/soul/.local/lib/python3.10/site-packages (from jinrdatabaseloader==0.0.1) (1.4.36) ... Successfully installed jinrdatabaseloader

~/tmp/jinr-database-tools$ jinr-database-loader-gui jinr-database-loader-gui: command not found

~/tmp/jinr-database-tools$ jinr-database-loader jinr-database-loader: command not found

Zelenyy commented 2 years ago

How OS and which version of pip used (pip --version)? Does direct start work python main_cli.py and python main_gui.py?

kgertsenberger commented 2 years ago

Hi. OS: Ubuntu 21.10, pip 22.0.2. Yes, direct start works well. Можно в принципе на русский здесь перейти, если нет возражений. У нас же здесь нет иностранцев)

Возможно кстати был pip и более старой версии, так как смотрел немного раньше, а сейчас на 22.04 обновился с этим pip.

Zelenyy commented 2 years ago

Я не много погуглил, люди жалуются на баги в pip 22.0.2, возможно из-за этого не сгненерировались скрипты для запуска.

kgertsenberger commented 2 years ago

Смотрю сейчас GUI, есть следующие предложения/замечания.

  1. Когда выбирается драйвер (и по-умолчанию при открытии приложения), устанавливать дефолтный порт, например, для PostgreSQL - 5432.
  2. Open json scheme help не работает.
  3. Как-то добился вылетов при работе с менеджером конфигураций, добавлял пустые-удалял. Цепочку действий не понял, если не получится разобраться по трейсу, то попробую повторить. python main_gui.py Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_manager_widget.py", line 100, in import_from_zip ret = QMessageBox.question(self, self.tr("Existing description can be overwritten. Do you want load description from ZIP?")) TypeError: PySide2.QtWidgets.QMessageBox.question(): not enough arguments Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 73, in setData self.setData(value, PathItem.NAME_ROLE) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 71, in setData self.sender.send(PathItem.NAME_ROLE) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 30, in send subscriber() File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_editor.py", line 259, in _update_title self.item.name, File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 53, in name return self.data(PathItem.NAME_ROLE) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 141, in data return super(FDItem, self).data(role) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 63, in data return super(PathItem, self).data(role) RuntimeError: Internal C++ object (FDItem) already deleted. Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_manager_widget.py", line 54, in lambda: self.delete_items([self.context_item])) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_manager_widget.py", line 92, in delete_items self.fd_model.delete_item(item) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 226, in delete_item item.delete() File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/description_model.py", line 115, in delete shutil.rmtree(self.path) File "/usr/lib/python3.10/shutil.py", line 712, in rmtree onerror(os.lstat, path, sys.exc_info()) File "/usr/lib/python3.10/shutil.py", line 710, in rmtree orig_st = os.lstat(path) FileNotFoundError: [Errno 2] No such file or directory: '/home/soul/.local/share/NPM_Group/JINR Database Tools/FileDescriptions/New collection'
  4. Если нет соединения с базой данных (неправильные параметры), то вылет при Load Database. Либо кнопку неактивной делать, либо выдавать сообщение. python main_gui.py Traceback (most recent call last): File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect return fn() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 310, in connect return _ConnectionFairy._checkout(self) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout fairy = _ConnectionRecord.checkout(pool) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout rec = pool._do_get() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 145, in _do_get with util.safereraise(): File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in exit compat.raise( File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get return self._create_connection() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection return _ConnectionRecord(self) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 371, in init self.connect() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 665, in connect with util.safereraise(): File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in exit compat.raise( File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 661, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect return dialect.connect(*cargs, *cparams) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 597, in connect return self.dbapi.connect(cargs, cparams) File "/home/soul/.local/lib/python3.10/site-packages/psycopg2/init.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, kwasync) psycopg2.OperationalError: connection to server at "nc13.jinr.ru" (159.93.63.13), port 5432 failed: FATAL: password authentication failed for user "db_reader"

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/backend.py", line 67, in load_to_database load_result = self.database.load_data(description, item.path) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/database.py", line 130, in load_data errors = self.check_description(description) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/database.py", line 93, in check_description if base_table not in self.engine.table_names(): File "", line 2, in table_names File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 401, in warned return fn(*args, kwargs) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3250, in table_names with self._optional_conn_ctx_manager(connection) as conn: File "/usr/lib/python3.10/contextlib.py", line 135, in enter return next(self.gen) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3002, in _optional_conn_ctx_manager with self.connect() as conn: File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3234, in connect return self._connection_cls(self, close_with_result=close_with_result) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 96, in init else engine.raw_connection() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3313, in raw_connection return self._wrap_pool_connect(self.pool.connect, _connection) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3283, in _wrap_pool_connect Connection._handle_dbapi_exception_noconnection( File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2117, in _handle_dbapi_exceptionnoconnection util.raise( File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect return fn() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 310, in connect return _ConnectionFairy._checkout(self) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout fairy = _ConnectionRecord.checkout(pool) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout rec = pool._do_get() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 145, in _do_get with util.safereraise(): File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in exit compat.raise( File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get return self._create_connection() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection return _ConnectionRecord(self) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 371, in init self.connect() File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 665, in connect with util.safereraise(): File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in exit compat.raise( File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 661, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect return dialect.connect(*cargs, *cparams) File "/home/soul/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 597, in connect return self.dbapi.connect(cargs, cparams) File "/home/soul/.local/lib/python3.10/site-packages/psycopg2/init.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "nc13.jinr.ru" (159.93.63.13), port 5432 failed: FATAL: password authentication failed for user "db_reader"

Буду дополнять пост по мере проб.

altavir commented 2 years ago

Давайте не использовать публичный треккер как чат (и светить контакты). Для этого есть Youtrack и Telegram.

kgertsenberger commented 2 years ago

Принято, связались с Михаилом в телеграм.

Zelenyy commented 2 years ago
  1. Принято
  2. Генрация для схемы генерируется как html файл, консольй скрипт просто её генерирует в текущую директорию, графический интерфейс в свою диреторию в .local, и новые политики безопасности убунты запрещают открывать html файлы оттуда, вероятно это кнопку можно просто убрать, так как этот html нужен только при использовании консольного интерфейса. (альтернатива открывать файл из домашней директории)
  3. Вообще там сейчас не должны вылазить ошибки при неправильных данных подключения, должно просто не подключатся, я это посмотрю и добавлю вывод какого-то сообщения о неправильных параметрах подключения
kgertsenberger commented 2 years ago

Предложения по переименованию и размещению в GUI:

  1. Я не очень долго думал, но предлагаю такое название для сервиса: Smart Data Parser. В принципе можно и другое название придумать, если есть идеи.
  2. "FIND CONNECTION TO DATABASE" -> "NO CONNECTION TO DATABASE"
  3. "Error log" -> "Error Panel". Лучше выделять легким фоном по всей кнопке в активном состоянии и разместить допустим на том же уровне, но справа, чтобы отделить от соединения с БД
  4. "Open json scheme help" -> "JSON format description". Добавить информацию для пользователя по заданию схемы парсинга в простейшем, кратком виде в файле в репозитории и сделать ссылкой из GUI. Можно и в help CLI добавить ссылку.
  5. Подсказки (tooltip) для 2ух кнопок справа от DATABASE SETTINGS и ERROR PANEL.
  6. "DRIVERNAME" -> "DRIVER"
  7. "FORMAT DESCRIPTION MANAGER" -> "DATA FORMAT MANAGER"
  8. Панель с файлами для преобразования разбить на две панели. Левая - не загруженные файлы, а справа загруженные в БД. И соответственно кнопки Clear для каждой панели отдельно.

Переименования help в CLI и предложения/замечания:

  1. "Add file to database." -> "Parse input data file and load to database"
  2. "positional arguments:" -> "commands"
  3. "usage: main_cli.py [-h] command ..." -> "usage: python main_cli.py [-h] command ..."
  4. "validate Validate json file" -> "validate Validate JSON file with input data format"
  5. "load Load file to database" -> "load Parse input data file and load to database"
  6. "json_schema Open HTML documentation for JSON Schema" -> "format Open description of the JSON schema for input data"
  7. Как работает generate не понял - вылетает сразу traceback: python main_cli.py generate Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/main_cli.py", line 4, in console_app() File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/run.py", line 118, in console_app args.func(args) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/run.py", line 95, in generate database = Database.connect_from_file(args.config) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/database.py", line 151, in connect_from_file with open(config) as fin: FileNotFoundError: [Errno 2] No such file or directory: 'config.json'
  8. Для load: "usage: main_cli.py load [-h] [-c CONFIG] -d JSON_DESCRIPTION FILE [FILE ...]" -> "usage: python main_cli.py [-h] load [-c connection_config] -s json_schema input_data_file [input_data_file2 ...]" "main_cli.py load: error: the following arguments are required: FILE, -d/--description" -> "main_cli.py load: error: the following arguments are required: input_data_file, -s/--schema"
  9. Добавить help по отдельным командам, когда python main_cli.py -h command
  10. python maincli.py load -d tests/data/detector.json tests/data/detector.csv tests/data/detector.json successfully validated. Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/main_cli.py", line 4, in console_app() File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/run.py", line 118, in console_app args.func(args) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/run.py", line 84, in load_to_database database = Database.connect_from_file(args.config) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/database.py", line 151, in connect_from_file with open(config) as fin: FileNotFoundError: [Errno 2] No such file or directory: 'config.json' В случае отсутствия файла соединения не вываливаться в traceback, а выдавать сообщение об отсутствии файла соединения (шаблон должен тогда лежать там же, где скрипт, чтобы его можно было легко найти, раз это необязательный параметр?).
  11. json successfully validated - лучше убрать. Выдавать сообщение только, если валидация не пройдена.
  12. "WARNING:root:Bad database connection!" - странное сообщение, оно автоматическое?
  13. "Can't connect to database" -> "Cannot connect to the database for data loading"

Что-то у меня тоже не работает загрузка в БД и в GUI и CLI, пробовал detector_.csv Traceback (most recent call last): File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/ui/backend.py", line 67, in load_to_database load_result = self.database.load_data(description, item.path) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/database.py", line 130, in load_data errors = self.check_description(description) File "/home/soul/tmp/jinr-database-tools/jinrdatabaseloader/database.py", line 99, in check_description metadata = MetaData(bind=conn, reflect=True) TypeError: MetaData.init() got an unexpected keyword argument 'reflect'

И кстати, когда просто открываю-закрываю GUI: python main_gui.py Segmentation fault (core dumped)

Zelenyy commented 2 years ago

Исправления по GUI Исправлено 1, 2, 6, 7, 8 Не понял какие кнопки в пунтке 5

Исправления по CLI: Исправлены: 1, 3, 4, 5, 6, 8, 11, 13

2 "positional arguments:" -> "commands" это зашито в парсер аргументов, так просто исправить не получится.

7 Сделал обработку ошибки, если конфиг не сущетсвует.

10 Добавил файл в корень проекта, добавил обработку различных ошибок

12 Заменил на вывод конкретного ответа от database API

Ошибка с подключение к базе данных связана с потерей совместимости между SqlAlchemy 1.3 и 1.4. Сейчас я сделал поддержку обоих версий, но надо решить что мы делаем: прибиваем гвоздями версию sqlalchemy (и заодно других библиотек) в setup.py (но тогда если другим приложения нужна будет другая версия, то их придется разносить по разным виртуальным окружениям) --- так обычно делают на веб-сервисах, либо надо будет отслеживать возможную потерю совместимости при обновлении библиотек.

Остальные пункты пока не разбирал, сделаю следующим обновлением.

kgertsenberger commented 2 years ago

Добрый день. Спасибо за информацию.

Кнопки из пункта 5 - это там 2 маленькие иконки - похоже на unpin (открепить) и close в виде крестика (закрыть).

"positional arguments:" - не принципиально, можно и так оставить

Отсуствие совместимости при переходе на следующую версию - это очень странная вещь, не думал, что в нормальных библиотеках такое возможно. Я бы не фиксировал конкретную версию, уж лучше отслеживать потерю совместимости. (лично для меня такие случаи скорее экстраординарные). Все-таки это не полноценный веб-сервис, а инструмент внутри нашего фреймворка.