[Python] PyMongo

Jay Mild Lee·2022년 10월 7일
0

web programming

목록 보기
6/9
post-thumbnail

🍺 Pymongo

MongoDB를 이용하기 위한 라이브러리로, MongoDB를 로컬 혹은 클라우드 환경에 설치 및 연결하여 사용할 수 있다.

🍕 설치

pip install pymongo

🍕 DB 연결: MongoClient

1) URI를 통한 연결

client = MongoClient("mongodb+srv://admin:admin@cluster0.uuxjj5e.mongodb.net/?retryWrites=true&w=majority", tlsCAFile=certifi.where())

2) 호스트와 포트 파라미터 입력

client = MongoClient(host='localhost', port=27017)

🍕 DB 접근

1) method 형태

db = client.test

2) dictionary 형태

db = client.['test']

🍕 Collection 접근

1) method 형태

collection = db.sample

2) dictionary 형태

collection = db['sample']

3) Collection list 확인 : collection_names()

DB에 존재하는 Collection의 목록을 전부 확인할 수 있다.

db.list_collection_names()

🍕 Document 생성

MongoDB는 Data를 JSON style로 저장한다. Python Dictionary를 활용하면 매우 편리하다.

doc = {
		'name' : name_receive,
		'comment' : comment_receive
}

🍕 Document POST: insert_one()

insert_one() 함수를 통해 간단하게 DB에 document를 추가할 수 있다.

db.sample.insert_one(doc)

🍕 Document POST: insert_many()

insert_many() 함수를 통해 여러 document를 한번에 추가할 수도 있다.

new_posts = [
    
    {
		'name' : name_receive,
		'comment' : comment_receive
    },
     
    {
		'name' : name_receive2,
		'comment' : comment_receive2
    }
    
]

db.sample.insert_many(new_posts)

🍕 Document 조회: find()

조건과 일치하는 모든 Document를 찾아 리턴한다.

    post_list = list(db.sample.find({'name':"jay"},{'_id':False}))

위 구문에서, {'_id':False}를 추가하면 자동으로 생성된 id 값을 제외하고 불러올 수 있다.

🍕 Document 조회: count_documents()

    db.sample.count_documents({'name': "jay"})

🍺 Trouble Shooting

🍕 [SSL: CERTIFICATE_VERIFY_FAILED]

Error message

pymongo.errors.ServerSelectionTimeoutError: ac-wecjdm3-shard-00-02.uuxjj5e.mongodb.net:27017: 
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1122),ac-wecjdm3-shard-00-01.uuxjj5e.mongodb.net:27017: 
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1122),ac-wecjdm3-shard-00-00.uuxjj5e.mongodb.net:27017: 
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1122), Timeout: 30s, Topology Description: <TopologyDescription id: 633ff0b1095b2763797c9d80, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-wecjdm3-shard-00-00.uuxjj5e.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('ac-wecjdm3-shard-00-00.uuxjj5e.mongodb.net:27017: 
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1122)')>, <ServerDescription ('ac-wecjdm3-shard-00-01.uuxjj5e.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('ac-wecjdm3-shard-00-01.uuxjj5e.mongodb.net:27017: 
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1122)')>, <ServerDescription ('ac-wecjdm3-shard-00-02.uuxjj5e.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('ac-wecjdm3-shard-00-02.uuxjj5e.mongodb.net:27017: 
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1122)')>]>

Environment

  • text editor : Atom
  • language : python 3.9
  • shell : Windows Powershell
  • venv

venv의 interpreter 확인

(.venv) ...dir...> python
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct  5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'...dir...\\.venv\\Scripts\\python.exe'
>>> exit()

확인 결과 이상 없음.

원인

https에 요청을 보낼 때, 유효성 검증을 하는 중에 발생하는 에러. 인증서 확인이 필요한데, 특정 인증서 없이 접근할 수 있도록 하는 방법이 필요.

해결

Certifi 모듈을 사용해 인증서 적용. 그냥 별 정보도 없는 쓸데없는 인증서임.

import certifi

client = MongoClient("mongodb+srv://admin:admin@cluster0.uuxjj5e.mongodb.net/?retryWrites=true&w=majority", tlsCAFile=certifi.where())

마지막에 tlsCAFile=certifi.where()만 추가해주면 된다.

0개의 댓글