일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- mongodb
- cleancode
- 환경변수
- 코드프레소
- 네트워크
- React
- fluentpython
- 코테
- javascript
- 위코드
- 전문가를위한파이썬
- env
- 패스트캠퍼스
- 리액트
- 원티드
- git
- 깃
- 파이콘코리아
- 알고리즘
- pyladies
- 예리님
- 플라스크
- codepresso
- 파이썬
- pyladiesseoul
- flask
- Python
- AWS
- js
- 프리온보딩
- Today
- Total
개발자가 내팔자
[Flask] PyMongo로 Flask + mongoDB로 DB 연결하기 본문
PyMongo를 이용한 이유
원래 이 블로그를 쓰려다가 갑자기 급발진해서 PyMongo와 MongoEngine을 비교하는 MongoDB 공식 포스트를 번역해버렸다.
왜냐하면 난 여기서 PyMongo를 썼는데, 도대체 그 둘의 차이가 뭔지 궁금했기 때문이다.
(Flask 공식문서에는 MongoEngine만 있기도 하고)
그래서 서치해보던 중 이 글을 보게 되어 재미있었고, 한국어 버전이 없길래 그냥 번역해버렸다.
아무튼 PyMongo를 썼다. 이게 보편적이기도 하고 익숙하기도 하고 그래서 썼는데,
보니까 PyMongo가 MongoDB에서 공식적으로 지원하는 native library라고 하니 좋은 선택이었던 같다.
https://pro-yomi.tistory.com/101
g?
https://flask.palletsprojects.com/en/2.1.x/tutorial/database/#connect-to-the-database
공식문서의 코드를 보면 flask로부터 이 g라는 한 글자짜리 무언가를 import하고 있다! 되게 궁금하게 생기지 않았는가?
난 궁금해 죽겠어서 이게 뭔지 지금부터 알아보려고 한다. 함께 알아보자.
import sqlite3
import click
from flask import current_app, g
from flask.cli import with_appcontext
def get_db():
if 'db' not in g:
g.db = sqlite3.connect(
current_app.config['DATABASE'],
detect_types=sqlite3.PARSE_DECLTYPES
)
g.db.row_factory = sqlite3.Row
return g.db
def close_db(e=None):
db = g.pop('db', None)
if db is not None:
db.close()
이런 코드와 함께 아래와 같은 내용이 나오는데,
g is a special object that is unique for each request. It is used to store data that might be accessed by multiple functions during the request. The connection is stored and reused instead of creating a new connection if get_db is called a second time in the same request.
대충 g는 매 request마다 유니크한 객체이며, 여러 함수에 의해 접근될 수 있는 데이터를 저장하는 무언가인듯. 이 만약 get_db가 같은 요청 안에서 두 번 불리더라도 새로 커넥션을 만드는 대신 connection이 저장되고 재사용된다는 뜻인 것 같다.
왠지 NodeJS에서 보던 CLS가 생각나지 않나??
https://aonemd.me/posts/continuation-local-storage/
Python도 JS도 싱글 스레드 기반으로 동작하기 때문에 비슷한 개념을 공유하고 있는 것 같다.
아무튼 Flask에서 PyMongo로 MongoDB 연결
다시 공식문서로 돌아와서, db랑 연결을 하려고 하는데
튜토리얼에서는 fileDB인 SQLite를 쓰고 있고,
https://flask.palletsprojects.com/en/2.1.x/tutorial/database/
mongodb를 검색하면 MongoEngine만 나온다.
https://flask.palletsprojects.com/en/2.1.x/patterns/mongoengine/
PyMongo로 하고 싶었기 때문에 (친숙한 ODM이기 때문) 적절히 조합해서 써봤다.
/db.py
import os
from flask import g
from pymongo import MongoClient
from dotenv import load_dotenv
load_dotenv(verbose=True)
def get_db():
if 'db' not in g:
client = MongoClient(os.getenv('DATABASE'))
g.db = client.test
return g.db
이런 식으로 쓰면 위에 나온 설명대로 get_db를 할 때마다 connection을 매 번 새로 생성하지 않고 재사용이 가능할 것이다. (공식문서에 따르면)
host 주소에는 비밀번호가 적혀있어서 dotenv를 이용하여 .env 파일에 있는 주소를 DATABASE 키로 가져왔다. 방법은 아래에 나와있다.
https://pro-yomi.tistory.com/100
그리고 app/__init__.py 에서 아래와 같이 DB 연결이 잘 되었는지 테스트할 수 있는 route를 만들었다.
@app.route('/db-connect-test')
def db_connect_test():
try:
db = get_db()
doc = {
'name': 'hi'
}
db.hello.insert_one(doc)
except OperationFailure:
return 'Error'
return 'OK'
물론 실제로는 이 코드에서 좀 더 귀여운 짓을 첨가해서 연결 상태에 따라 문구가 나오도록 했다.
'WEB > Back-end' 카테고리의 다른 글
[Ruby on Rails] 공식문서와 함께 하는 30분 만에 블로그 만들기! - 게시판 꾸미기/유효성검증 (0) | 2022.08.08 |
---|---|
[Ruby on Rails] 공식문서와 함께 하는 30분 만에 블로그 만들기! - 게시판 CRUD (0) | 2022.08.08 |
[MongoDB] JSON과 BSON의 차이 (번역) (0) | 2022.08.05 |
[MongoDB] PyMongo MongoEngine의 차이는? (번역) (0) | 2022.08.02 |
[Flask] .env로 환경변수를 관리하여 보안이 든든한 서버를 개발해보자 (dotenv) (0) | 2022.08.01 |