BE/Flask

[블로그 구현 with Flask] 1. MySQL / MongoDB 데이터베이스 셋업

StoneSeller 2022. 6. 14. 21:08

변경 여지가 적은 경우, 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()

사용자 테이블

  • USER_ID로 사용자 정보 접근

 

# 기존 테이블 수 확인
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
728x90