변경 여지가 적은 경우, mySQL과 같은 관계형 데이터베이스를 사용
변경 여지가 큰 웹서비스 로깅을 위해서는 NoSQL을 사용
(웹 서비스 성능 향상을 위해 redis같은 in-memory 방식의 데이터베이스도 많이 사용됨)
블로그 기능에서의 데이터베이스 활용
- mysql: 구독으로 얻어진 이메일 주소 정보를 저장
- mongodb: 블로그 접근 사용자의 IP와 접근 시간을 로그 형태로 저장
- 로깅은 통상적으로 수시로 포맷이 바뀌는 경우가 많으므로 스키마 설정이 필요없는 NoSQL이 적합
MySQL
cmd 창에서 blog_db 데이터베이스 생성
mysql -u root -p
Enter password: 비밀번호입력
mysql> CREATE DATABASE blog_db;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| bestproducts |
| blog_db |
| dave |
| ecommerce |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| student_mgmt |
| sys |
| world |
+--------------------+
mySQL CRUD 간단하게 복습
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', password='비밀번호', db='blog_db', charset='utf8')
blog_db = db.cursor()
사용자 테이블
# 기존 테이블 수 확인
sql = 'SHOW TABLES;'
blog_db.execute(sql)
0
sql = """
CREATE TABLE user_info (
USER_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
USER_EMAIL VARCHAR(100) NOT NULL,
BLOG_ID CHAR(4),
PRIMARY KEY(USER_ID)
);
"""
blog_db.execute(sql)
db.commit() # database를 변경하는 명령은 commit()해야함
# 기존 테이블 수 확인
sql = 'SHOW TABLES;'
blog_db.execute(sql)
1
# 테이블 삭제
sql = "DROP TABLE user_info;"
blog_db.execute(sql)
db.commit()
# 테이블 수 다시 확인
sql = "SHOW TABLES"
blog_db.execute(sql)
0
# 테이블에 데이터 넣기
user_email = 'test@naver.com'
blog_id = 'A'
sql = "INSERT INTO user_info (USER_EMAIL, BLOG_ID) VALUES ('%s','%s')" % (str(user_email), str(blog_id))
blog_db.execute(sql)
db.commit()
# 테이블 데이터 조회(SELECT)
sql = "SELECT * FROM user_info"
blog_db.execute(sql)
results = blog_db.fetchall()
for result in results:
print(result, type(result))
(1, 'test@naver.com', 'A') <class 'tuple'>
# USER_EMAIL로 테이블 조회
sql = "SELECT * FROM user_info WHERE USER_EMAIL = '" + str('test@naver.com') + "'"
blog_db.execute(sql)
results = blog_db.fetchall()
for result in results:
print(result, type(result))
(1, 'test@naver.com', 'A') <class 'tuple'>
# 데이터베이스 연결 해제
db.close()
MongoDB
import pymongo
username = ''
password = ''
ip_address = 'localhost'
connection = pymongo.MongoClient()
connection = pymongo.MongoClient('mongodb://%s' % (ip_address))
# connection = pymongo.MongoClient('mongodb://%s:%s@%s' % (username, password, ip_address))
blog_session_db = connection.blog_session_db
blog_ab = blog_session_db.blog_ab # collection
연결 확인
connection.admin.command('ismaster')
CRUD 복습
# INSERT
blog_ab.insert_one({'emailid' : 'juldaegwajaehae@gmail.com'})
# SELECT
blog_ab.find_one({'emailid' : 'juldaegwajaehae@gmail.com'})
{'_id': ObjectId('627befa5731a98edae551473'),
'emailid': 'juldaegwajaehae@gmail.com'}
# DELETE
blog_ab.delete_one({'emailid' : 'juldaegwajaehae@gmail.com'})
# SELECT *
blog_logs = blog_ab.find()
for log in blog_logs:
print(log)
MVC 구조로 폴더를 생성
FLASK_ABTEST
├─blog_control
│ session_mgmt.py
│ user_mgmt.py
│
├─blog_view
└─db_model
mongodb.py
mysql.py
db_model > mongodb.py
import pymongo
MONGO_HOST = 'localhost'
MONGO_CONN = pymongo.MongoClient('mongodb://%s' % (MONGO_HOST))
def conn_mongodb():
try:
MONGO_CONN.admin.command('ismaster')
blog_ab = MONGO_CONN.blog_session_db.blog_ab
except:
MONGO_CONN = pymongo.MongoClient('mongodb://%s' % (MONGO_HOST))
blog_ab = MONGO_CONN.blog_session_db.blog_ab
return blog_ab
db_model > mysql.py
import pymysql
MYSQL_HOST = 'localhost'
MYSQL_CONN = pymysql.connect(
host=MYSQL_HOST,
port=3306,
user='root',
passwd='비밀번호',
db='blog_db',
charset='utf8'
)
def conn_mysqldb():
if not MYSQL_CONN.open:
MYSQL_CONN.ping(reconnect=True)
return MYSQL_CONN
blog_control의 session_mgmt.py, user_mgmt.py에 각각 필요한 데이터베이스 연결
from db_model.mongodb import conn_mongodb
from db_model.mysql import conn_mysqldb