프로그래밍/Python 13

Alembic으로 쉽게 DB 마이그레이션하기

Alembic 도입 계기개발하고 있는 토이 프로젝트에 (정말정말 귀찮지만-) DB를 도입했다.최대한 기술스택을 간단하게 가져가고싶었지만 더 풍부한 기능지원을 위해 굴복했다. Python ORM 라이브러리 SQLAlchemy를 도입했는데, 계속 테이블을 수정하면서 수동 마이그레이션에 한계가 있다고 느껴서 찾아보니 Alembic이라는 SQLAlchemy 사용자용 DB 마이그레이션 툴이 있더라. 회사에서 백엔드 코드를 눈팅하면서 본 마이그레이션 파일들이 이녀석이 만든것이었다. 사용하기도 간편해서 다음번에 또 쓸 것 같아 간단히 사용법을 기록하겠다. 시작하기초기화Alembic을 사용하기에 앞서, 아래 명령어로 초기화하면 설정 파일인 alembic.ini 파일과 Alembic 프로젝트가 만들어진다.alembic ..

[Python] SlackBot 쉽게 만들기

오늘 소개할 것은 Slack Bolt다. Slack Bolt 이전에는 슬랙봇을 만들기 위해 Redirect URL을 App에 정의 해주어야 했고, 그렇기 때문에 도메인도 필요하고 LocalHost에서 돌릴려면 ngrok 같은 서비스도 부가적으로 이용해야 했다. 웹 애플리케이션을 만들어야 했던건 덤이다 ㅎ... 하지만 이 모든것은 Bolt선에서 모두 정리된다! 두-둥 시작하기 슬랙 앱 만들기 봇 토큰 Scope 요청해서 토큰 발급받기 위 2가지 과정이 선행되어야 함은 기존과 변함없다. 하지만 Socket Mode를 켜줘야하는 추가 설정이 필요하다. Socket Mode는 우리의 봇이 HTTP 엔드포인트를 노출하지 않고도 작동할 수 있게 해준다. 설령 봇이 방화벽 뒤에있더라도 말이다. Socket Mode를..

[Python] zstandard로 dictionary list 압축하기

# ZstdHelper HTML 삽입 미리보기할 수 없는 소스 아래 내용을 토대로만든 Zstd 헬퍼 클래스입니다. # 압축 ZstdHelper().compress(dictlist) # 압축해제 dictlist = ZstdHelper().decompress(filename) # pickle? 파이썬에서 dictionary list를 파일로 저장하고, 다시 읽으려고 할때 일반적으로는 간편한 pickle을 이용한다. 10만개의 딕셔너리를 담고있는 파이썬 리스트를 파일로 저장하고, 읽는 예시 코드를 보자. if __name__ == '__main__': result = list() for i in range(1, 100000): result.append({"indexofitem": i}) pickle_test(..

CLI로 Python 실행시 No module named 오류 해결방법

# ModuleNotFoundError PyCharm같은 통합개발환경(IDE)에서 편하게 개발할때는 이슈가 없었는데, VS code로 docker에 띄울 배치 스크립트를 개발하던 중 문제가 생겼다. 가상환경(Virtual Environment)을 구성하여 활성화시키고, 실행시켰는데 모듈을 찾을 수 없다는 것이다. python .\my_game\batch1.py Traceback (most recent call last): File "C:\Users\ASUS\PycharmProjects\RankingServer\batch\my_game\batch1.py", line 6, in from libs.task.TaskManager import TaskManager ModuleNotFoundError: No mod..

[Windows] mysqlclient 설치하기 (pip install mysqlclient)

MySQLdb/_mysql.c(29): fatal error C1083: 포함 파일을 열 수 없습니다. 'mysql.h': No such file or directory error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30 133\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2 pip install mysqlclient를 하려고하면 위 오류로 인해 설치가 막힌다. # 빠른 해결법 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 사이트에 접속하여 mysqlclient 중 ..

Python 특정 키 값을 기준으로 Dictionary List에서 더하기

문제 arr = [] arr.append({"name": "A", "acquired_xp": 200, "key": 1, "data": 1}) arr.append({"name": "B", "acquired_xp": 500, "key": 2}) arr.append({"name": "B", "acquired_xp": 500, "key": 3}) arr.append({"name": "C", "acquired_xp": 750, "key": 4}) arr.append({"name": "A", "acquired_xp": 300, "key": 5})이렇게 Dictionary로 이루어진 리스트가 있고, acquired_xp항목을 이름에 따라 더하려고 한다. key는 고유값이므로 더하면 안되며, 첫번째로 만나는 key값을..

Python 정규식 그룹명으로 match 결과 가져오기 (group name)

filename = "backup_20220409180756_20220423180756" regex = re.compile(r"^backup_(?P\d+)_(?P\d+)$") match = regex.search(filename) if match: print(match.group("end")) # "20220423180756" 정규식 그룹명을 이용하면 편리하게 원하는 부분을 추출해낼 수 있다. (?P) 같은 식으로 사용할 수 있는데 위 예제는 정규식을 활용하여 파일명에서 시작시간과 끝시간을 뽑아내는 예제이다. 정규식 작성에 앞서 정규식을 테스트 해보기위해 regexr.com를 많이 이용하는데, 그룹명 테스트 만큼은 regex101이라는 사이트가 훨씬더 친절하게 결과가 나온다.

Falcon req.get_param()으로 모든 파라미터를 받아보자

일반적으로 Falcon에서는 Query parameter에 있는 값을 req.get_param('name')으로 읽어올 수 있다. 하지만 폼데이터 역시 동일한 방법으로 얻어오면 구분은 안가긴 하지만 편할 것이다. 간단한 세팅으로 이를 실현시킬 수 있다. application/x-www-form-urlencoded application/x-www-form-urlencoded로 들어오는 값들도 req.get_param()을 통해 얻고 싶다면 아래 라인을 추가하면 된다. app.req_options.auto_parse_form_urlencoded = True multipart/form-data 추가로 falcon-multipart라는 모듈 설치가 필요하다. pip install falcon-multipart ..

Python 프로젝트 패키지 관리하기: pip freeze requirements.txt

파이썬 프로젝트에 설치한 수많은 라이브러리의 의존성을 관리하기 위하기 위한 방법이다. 이것이 왜 중요하냐면, 당연하게도 프로그램이 언제나 내 컴퓨터에서만 돌아가는 것은 아니기 때문이다. 다양한 환경에서 배포되고 실행될 수 있어야하며, 그때마다 프로젝트에서 사용한 모듈을 설치해주어야하는데... 아래 명령어를 이용하면 현재 가상환경에 설치되어있는 패키지 목록을 requirements.txt 파일에 작성해준다. pip freeze > requirements.txt 다른 환경에서 requirements.txt에 적힌 모듈들을 모두 설치하는 방법은 아래와 같다. pip install -r requirements.txt install 명령어의 -r 옵션은 --requirement로, 주어진 requirement 파..