Python, MongoDB 예제
글. 수알치 오상문
[1] 초기 부분
import time
import datetime
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId # 문자열 ID 값 조회 시 bjson 변환 사용
from pprint import pprint
# pmongo 버전 출력 (몽고DB 버전이 아님)
print(pymongo.__version__) # 4.1.1
MongoDB 용어:
Database > collection(table) > document(row, record)
[2] MongoDB 접속 부분
1) 비인증 모드 접속 예
conn = MongoClient(host='localhost',
port=27017,
minPoolSize=1,
maxPoolSize=128)
2) 인증 모드 접속 예 : MongoDB 서버가 인증 모드로 실행된 경우
[참고] 몽고디비 서버를 인증 모드로 시작: mongod --auth
ID = 'admin'
PW = '1234'
DB = 'sample'
HOST = 'localhost'
PORT = 27017
conn = MongoClient(f'mongodb://{ID}:{PW}@{HOST}:{PORT}')
[3] 커넥션 확인
if conn:
print('MongoDB is connected.\n')
else:
print('MongoDB connection Error')
exit(1)
[4] 데이터베이스, 컬렉션 인스턴스 생성
db = conn.sample # conn['sample']
memo = db.memo # db['memo']
[5] 데이터 입력 (도큐먼트/레코드)
1) 날짜를 현재 기준으로 넣기 (로컬 시간)
저장된 자료의 id를 반환받아서 저장하고 있다. 나중에 검색에 활용할 수 있다.
post_id = memo.insert_one({
'name': '손오공',
'memo': '오늘도 구름 탄다.',
'tag': ['서유기', '삼장법사', '천축국'],
'created': datetime.datetime.now() # 로컬 시간
}).inserted_id
2) 날짜를 현재 기준으로 넣기 (세계표준시, UTC)
post_id = memo.insert_one({
'name': '감사용',
'memo': '야구합시다',
'tag': ['야구', 'baseball'],
'created': datetime.datetime.utcnow() # 세계표준시
}).inserted_id
[6] 현재 디비의 컬렉션(테이블) 목록 확인
print("collection:", db.list_collection_names()) # ['memo']
[7] memo 컬렉션의 자료(도큐먼트/레코드) 목록 출력
for r in memo.find():
pprint(r)
[참고] pprint() 함수는 사전/json 자료를 보기 좋게 출력한다.
[8] 현재 컬렉션의 도큐먼트(row) 수
print(f'현재 컬렉션의 도큐먼트(row) 수: {memo.count_documents({})}')
[9] 컬렉션의 첫 번째 도큐먼트 출력
row = memo.find_one() # 첫 도큐먼트
pprint(row)
[10] name이 '손흥민'인 자료를 1개 찾아서 출력
row = memo.find_one({'name' : '손흥민'})
pprint(row)
[11] _id값으로 찾기
pprint(memo.fine_one({'_id': post_id})
post_id 값은 자료 저장 시 확인할 수 있다.
# 문자열 값 id로 조회 시 ObjectID로 변환하여 사용
post_id = '62b6aa0ccb14d9bb5a72a51d' <-- 목록에서 확인한 값으로 검색
pprint(memo.find_one({'_id': ObjectId(post_id)}))
[12] 업데이트
row 하나 업데이트 : 지정한 키만 업데이트하고 나머지 유지됨
검색 조건이나 업데이트 키가 여러 개이면 ','로 구분하여 더 넣어주자.
memo.update_one({'name': '손오공'},
{'$set':{'memo':'오늘도 근두운을 탄다'}})
[13] 삭제
1) row 하나 삭제
memo.delete_one({'name': '수알치'})
2) memo 컬렉션(테이블)의 도규먼트(레코드)를 모두 삭제
try:
memo.drop()
except Exception as e:
print('테이블 모든 레코드 삭제 에러:', e)
[14] 조건 검색
1) name이 허난설헌, 홍길동, 수알치인 경우
for r in memo.find({'name': {'$in': ["허난설헌", "홍길동", "수알치"]}}):
pprint(r)
2) 날짜로 검색 (시작일과 종료일 사이 조건 검색)
start = datetime.datetime(2022, 1, 1)
end = datetime.datetime(2022, 12, 31)
rows = memo.find({"created": {'$gte': start, '$lte': end}})
for r in rows:
pprint(r)
[15] 몽고 DB 연결 해제
conn.close()
[16] 관리자 계정 생성 (mongo.com 실행 모드에서)
use admin
db.createUser( { user: "develop",
pwd: "1234",
roles: [ "userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]})
[전체 코드]
import time
import datetime
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId # 문자열 ID 값 조회 시 bjson 변환 사용
from pprint import pprint
print(pymongo.__version__) # 4.1.1
# MongoDB 용어: Database > collection(Table) > document(row, record)
'''
# MongoDB 접속 (비인증 모드)
conn = MongoClient(host='localhost',
port=27017,
minPoolSize=1,
maxPoolSize=128)
'''
# MongoDB 접속 (인증 모드) : MongoDB 서버가 인증 모드로 실행된 경우
# Mongo.exe 실행창에서 이용자 생성한다. 생성 명령은 가장 후반부 참조
# 몽고디비 서버를 인증 모드로 시작: mongod --auth
ID = 'admin'
PW = '1234'
DB = 'sample'
HOST = 'localhost'
PORT = 27017
conn = MongoClient(f'mongodb://{ID}:{PW}@{HOST}:{PORT}')
if conn:
print('MongoDB is connected.\n')
else:
print('MongoDB connection Error')
exit(1)
db = conn.sample # conn['sample']
memo = db.memo # db['memo']
'''
# 날짜를 현재 기준으로 넣기 (로컬 시간)
post_id = memo.insert_one({
'name': '손오공',
'memo': '오늘도 구름 탄다.',
'tag': ['서유기', '삼장법사', '천축국'],
'created': datetime.datetime.now() # 로컬 시간
}).inserted_id
# 날짜를 현재 기준으로 넣기 (세계표준시, UTC)
post_id = memo.insert_one({
'name': '감사용',
'memo': '야구합시다',
'tag': ['야구', 'baseball'],
'created': datetime.datetime.utcnow() # 세계표준시
}).inserted_id
post_id = .inserted_id
print('POST ID:', post_id)
'''
# print("collection:", db.list_collection_names()) # ['memo']
#for r in memo.find():
# pprint(r)
print(f'현재 컬렉션의 도큐먼트(row) 수: {memo.count_documents({})}')
print()
row = memo.find_one() # 첫 도큐먼트
pprint(row)
print()
row = memo.find_one({'name' : '손흥민'})
pprint(row)
print()
# pprint(memo.fine_one({'_id': post_id})
# 문자열 값 id로 조회 시 ObjectID로 변환하여 사용
post_id = '62b6aa0ccb14d9bb5a72a51d'
pprint(memo.find_one({'_id': ObjectId(post_id)}))
print()
# row 하나 업데이트 : 지정한 키만 업데이트하고 나머지 유지됨
# 검색 조건이나 업데이트 키가 여러 개이면 ','로 구분하여 더 넣어주자.
#memo.update_one({'name': '손오공'},
# {'$set':{'memo':'오늘도 근두운을 탄다'}})
# row 하나 삭제
# memo.delete_one({'name': '수알치'})
# memo 컬렉션(테이블)의 도규먼트(레코드)를 모두 삭제한다
'''
try:
memo.drop()
except Exception as e:
print('테이블 모든 레코드 삭제 에러:', e)
'''
# 조건 검색 (name이 허난설헌, 홍길동, 수알치인 경우)
print("조건 검색")
for r in memo.find({'name': {'$in': ["허난설헌", "홍길동", "수알치"]}}):
pprint(r)
# 날짜 조건 검색
print('날짜 조건 검색')
start = datetime.datetime(2022, 1, 1)
end = datetime.datetime(2022, 12, 31)
rows = memo.find({"created": {'$gte': start, '$lte': end}})
for r in rows:
pprint(r)
# 몽고 DB 연결 해제
conn.close()
print('MongoDB is disconnected.')
'Python 활용' 카테고리의 다른 글
Python, 백그라운드 스케줄러 예제 (0) | 2022.06.27 |
---|---|
Python, mysql (pymysql) auto reconnect (0) | 2022.06.27 |
python과 MongoDB 연동, MongoDB 실습 (0) | 2022.06.25 |
python, MySQL Pool database.py, main.py 분리 예제 2 (0) | 2022.06.25 |
python, MySQL Pool database.py, main.py 분리 예제 1 (0) | 2022.06.25 |