>  기사  >  백엔드 개발  >  이번 주에 배운 것 #0

이번 주에 배운 것 #0

PHPz
PHPz원래의
2024-07-25 22:54:53806검색

What I

적어도 내 개인적인 경험의 관점에서 볼 때 나는 매주 하나 이상의 새로운 것을 배우고 있습니다. 그래서 여기에서 공유하는 것이 지식의 일부를 확고히 하고, 기록을 유지하며, 잠재적으로 다른 사람이 이전에 알지 못했던 것을 배울 수 있도록 돕는 좋은 방법이 될 것이라고 생각했습니다.

이번 주에 저는 데이터베이스 백업 이름 목록을 가져오고, 데이터베이스를 MySQL로 가져온 다음, Flask 컨텍스트를 시작하고, 있는 그대로 데이터베이스에 대한 보고서를 실행할 수 있는 Python 스크립트를 작성하는 것이 가능하다는 것을 배웠습니다. 그런 다음 헹구고 반복하세요.

간단한 개념처럼 들릴 수도 있지만, 대부분 표준적인 접근 방식을 사용하여 이를 달성하려는 노력은 믿을 수 없을 정도로 어려웠습니다. 저는 백업을 가져오는 스크립트를 작성하는 것으로 시작한 다음 가져온 데이터에 대한 보고서를 실행하고 이를 루프에 넣었습니다. 그런데 안타깝게도 2nd 루프 반복에 매달린 터미널을 만나 무슨 일이 일어날지 분석하기 시작했습니다.

가장 먼저 떠오른 생각은 Flask 앱에서 가져오던 작업으로 인해 스크립트가 아직 종료되지 않았기 때문에 가져오기가 차단되어 Flask와의 데이터베이스 연결을 유지하는 잠금이 여전히 활성화되어 있다는 것이었습니다. , 그러나 이런 일이 발생했음을 알려주는 오류 메시지는 없었고 의도적으로 설계된 것이라고 가정하므로 Flask에 대한 경험을 바탕으로 이것이 그럴 가능성이 가장 높다고 합리화했습니다.

그래서 저는 Flask에서 가져온 모듈을 간단히 '가져오기 취소'하는 방법을 검색하다가 작업을 완료하기 위해 Python에서 del 키워드를 발견하고 다시 시도했습니다. 이전에 내가 앉았던 동일한 교수형 터미널. 그래서 다시 원점으로 돌아왔습니다.

다음으로 생각한 것은 모듈이 제거되었지만 Flask 앱 컨텍스트가 여전히 어딘가에서 실행되고 있다는 것입니다. Flask 앱 컨텍스트를 내가 원하는 곳에서 강제로 실행하고 중지하기 위해 약 2년 전 이전 작업에서 사용한 접근 방식을 시도했습니다. 여기서는 Flask 앱 컨텍스트를 사용하여 이메일을 비동기식으로 보내야 했습니다.

그런 다음 for 루프 내에서 앱을 가져온 다음 with app.app_context(): 명령을 사용하여 Flask가 지정된 컨텍스트 내에서만 시작되고 중지되도록 했습니다. 그런 다음 스크립트를 실행하고 첫 번째 루프에서 데이터베이스를 가져오는 데 몇 분 정도 기다리면서 숨을 죽이고 터미널을 관찰한 다음 이전과 마찬가지로 두 번째 루프부터 시작하여 성공했습니다! 두 번째 가져오기가 성공했고 보고서가 완료되었음을 나타내는 예상되는 다음 단계 출력을 얻었고 이를 출력 파일과 비교하여 확인했습니다.

이전에는 해본 적이 없는 결과여서 만족스러웠고, 결과를 파악하고 예상대로 작동하게 할 수 있어서 기뻤습니다.

처음에 왜 이걸 하려고 했는지 궁금하실 수도 있는데 좋은 질문이네요. 데이터베이스 백업 이외의 다른 곳에 저장되지 않았고 현재 라이브 데이터베이스에서 수집할 수 없는 데이터가 필요한 과거 월간 보고서를 가져오는 임무를 맡았기 때문에 이 데이터를 가져오는 데 사용할 백업만 있었습니다. . 이것이 제가 데이터베이스 가져오기와 함께 Flask 컨텍스트를 관리하는 방법을 배우게 된 이유입니다.

코드 읽기를 즐기는 분들을 위해 스크립트를 다음과 같이 구성했습니다.

import os # for running the database import command

backup_name_list = [
    "backup1",
    "backup2"
]

for backup_name in backup_name_list:
    # do all necessary changes or checks on the db name here
    command = f"mysql -u db_user_name --password='SomePassword' db_name < '/path/to/{backup_name}.sql'"
    os.command(command)

    # import the app variable to allow for the context to be created
    from app_module import app_variable

    with app_variable.app_context():
        # do all Flask related imports here
        from app_module import relevant_app_class_or_function

        # run all relevant code here to build up your data from the loaded backup

        # remove the imported modules
        del relevant_app_class_or_function

    # remove the app variable after the context expires just to be safe
    del app_variable

그래서 데이터베이스 백업에서만 기록 데이터를 가져올 수 있었습니다.

이 내용은 매우 구체적이며, 이 내용은 튜토리얼이 아니며 순전히 개인적인 학습 경험을 위한 출구일 뿐이라는 점을 알고 있습니다. 이 내용이 흥미로운 읽기 또는 유용한 정보가 되기를 바라면서 여기에서 공유하고 싶습니다. 어딘가에 있는 누군가에게 유용한 팁을 제공합니다.

여기까지 읽어주셔서 감사하다는 말씀을 전하고 싶고, 다음 포스팅에도 많은 참여 부탁드립니다.

위 내용은 이번 주에 배운 것 #0의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.