Python импортирует базу данных из файла .gz

#python #mysql #sql #docker

#python #mysql #sql #docker

Вопрос:

Я работаю с инструментом, в котором я получаю дамп базы данных для MySQL и Postgresql в .gz сжатом файле. Этот файл я экспортировал ранее без проблем (используя python). Однако, когда мне нужно протестировать импорт, это не работает.

Инструмент работает внутри контейнера docker. Мой код на python предоставлен,

 def cmd_schema_import(self, args=None):


    self.require_configured(with_containers=True)
    compressed_import_file = os.path.join(self.project_path, "database", config['database_backup'])

    # no file exist for the database import
    if (not os.path.isfile(compressed_import_file)):
        return

    # run mysql dump
    u, p, d = config['default_db_user'], config['default_db_pass'], config['default_db_name']
    command = f'mysqldump -u {u} -p"{p}" {d}'

    if self.project_conf["db_driver"] == "pgsql":
        command = f'exec psql --quiet -U {u} -d "{d}"'

    additional_options = "| gunzip < %s --keep" % compressed_import_file
    self.docker.exec(self.db_container, command, additional_options)
  

Функция вызывает метод docker, предоставляемый,

 def exec(self, container_target, command, additional_options=""):
    """ execte docker exec commmand and return the stdout or None when error"""
    cmd = """docker exec -i "%s" sh -c '%s' %s""" % (
        container_target, command, additional_options)
    if self.verbose:
        print(cmd)
    try:
        cp = subprocess.run(cmd,
                            shell=True,
                            check=True,
                            stdout=subprocess.PIPE)
        return cp.stdout.decode("utf-8").strip()
    except Exception as e:
        print(f"Docker exec failed command {e}")
        return None
  

Я пытаюсь отладить код, но здесь он зависает,

 cp = subprocess.run(cmd,
                            shell=True,
                            check=True,
                            stdout=subprocess.PIPE)
  

Я ценю любой совет.

Комментарии:

1. Что вы имеете в виду this doesn't work ? В чем ошибка?

2. Я упоминал «Я пытаюсь отладить код, но здесь он зависает»

3. Вы пытались выполнить то, что заканчивается cmd в этой строке командной строки? Я подозреваю, что команда, которую вы в конечном итоге получаете, не совсем то, что вы имели в виду.

4. @bgse вы правы, и с docker есть намного лучший вариант для этого. Мы можем смонтировать SQL-файл с хоста в контейнер, и они будут синхронизированы. Я думаю, что мне нет смысла отключаться от .gz файла.