Я пытаюсь сделать скрипт Python, который (по порядку)

  1. выгружает базу данных mysql в файл в /tmp/x.sql
  2. открывает этот файл
  3. записывает этот файл в mongo gridfs

Мотивация: много разных версий базы данных для тестирования.

Моя проблема: Шаг 1 не завершает запись в файл до запуска Шага 2, поэтому считывается пустой файл

Что у меня есть

# filename is a generated uuid4

def step_1(filename):
    d = dict(environ)
    d["MYSQL_PWD"] = "root_pass"
    file = open(filename, "wb")

    subprocess.Popen(
        ["mysqldump", "-h", "0.0.0.0", "-u", "root", "database"], stdout=file, env=d
    )

def step_2(filename):
    with open(filename, "rb") as f:
        file = f.read()       <- This is always empty
        mongo_gridfs.put(data, content_type = 'file/txt')
        mongo_gridfs.save()

Прямо сейчас мое «решение» просто вызывает sleep(1)

Кажется, в file нет метода, который сообщает вам, пишется ли он или завершена ли запись, поэтому я просто ищу способ узнать, был ли файл записан, чтобы я не нужно звонить sleep(1)

Если есть способ передать это прямо в объект ByteIO и прочитать это в gridfs, это было бы еще лучше.

0
isebarn 4 Окт 2022 в 21:17

1 ответ

Хорошо нашел два отличных ответа за 1 минуту

Делать

    process = subprocess.Popen(
        ["mysqldump", "-h", "0.0.0.0", "-u", "root", "s2r-db"], stdout=PIPE, env=d
    )

    process.wait() <- add this

Заставил это работать, но также добавил PIPE к stdout и прочитал его в BytesIO вместо записи файла

0
isebarn 4 Окт 2022 в 21:50