새소식

BE/Flask

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

  • -

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