일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 람다식
- 타입
- SQL 문제
- 자바스프링
- java설치
- 플랙스박스기본
- 자바 스프링
- Hooks
- 이클립스
- spring
- 관계형데이터베이스
- node.js
- spring 환경설정
- ubuntu
- 리액트
- Flexbox Froggy
- SQL 연산자
- HTML5
- 스프링
- 환경설정
- SQL
- 객체지향프로그래밍
- REACT
- Eclipse
- SQL 명령어
- numpy
- 노마드코더
- 오산대맛집
- java spring
- Flex Box 기본
- Today
- Total
이것저것
(3) 모델 생성하기 본문
하 작성한거 다 날아가서 다시 작성한다 ㅡㅡ
-참고-
flask init으로 migrations 폴더까지 생성했다.
이제 데이터베이스의 스키마를 만들어야한다.
위에 참고페이지에서는 SQLite를 사용하였지만 나는 MySQL을 사용할것이므로 코드만 아마 다를 것 같다.
여기 부분은 생략하고 진행하셔도됩니다.
먼저 참고페이지와 다르게 나는 MySQL에서 데이터가 불러와지는지 workbench에서 ERD를 만드는 작업을 했었다.
이렇게 먼저 ERD를 만들었고 pycharm에서 불러오도록 코드를 만들어보았다.
test.py라고 폴더를 만들었고
import pymysql
db = pymysql.connect(host="127.0.0.1",user="root",password="1234", db="dms", charset="utf8")
#cursor는 Connection으로부터 Cursor를 생성하고, db의 sql문을 실행하고 조회된 결과를 가져오는 역할을 한다.
cursor = db.cursor()
sql = "select * from users"
# execute : cursor 객체에 sql문을 실행, 지금은 user table을 불러왔다.
# -executemany : cursor 객체에 동일한 sql문에 파라미터를 변경하여 실행한다.
# - executescript : cursor객체에 세미콜론으로 구분된 여러줄의 sql문을 실행한다.
cursor.execute(sql)
# db 데이터 가져오기 cursor의 메소드
# cursor.fetchall() #모든 행 가져오기
# cursor.fetchone() # 하나의 행만 가져오기
# cursor.fetchmany() # n개의 데이터 가져오기 (n)이렇게 넣어주면된다.
rows = cursor.fetchall()
print(rows)
# DB에 생성, 삭제, 수정등 데이터 변동이 생기면 commit()으로 저장을 해줘야한다.
db.commit()
db.close()
이렇게 코드를 넣었다. 인터넷에서 찾아보면서 작성했다.
host 는 그냥 "localhost"라고 작성해도 돌아간다.
user와 password는 MySQL을 만들때 작성한 user와 password SQL책을 참고하면 보통 root와 1234로 만든다.
db에 dms는 내가 만든 데이터베이스의 이름, charset은 한글을 지원하기 위해서 utf-8로
sql은 select 문으로 내가 만든 users라는 테이블을 불러와 보았다.
(제대로 불러와지는지 확인하기 위해서)
이걸로 제대로 불러와지는지 확인했고
이제 참고페이지를 통해서 db작업을 해보려고한다.
먼저 나는 Users, Sleep, Ciga, Phone이라는 테이블을 만들었다.
그래서 그 테이블을 토대로 모델을 생성할 것이다.
pybo폴더 안에 models.py라는 파일을 생성하고 그 안에 코드를 작성하였다.
from pybo import db
from datetime import datetime
class Users(db.Model):
__tablename__ = 'Users'
users_id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(60), nullable=False)
users_name = db.Column(db.String(45), nullable=False)
email = db.Column(db.String(60), nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False)
users_birth = db.Column(db.Date)
users_phone = db.Column(db.String(45))
address_main = db.Column(db.String(255))
address_sub = db.Column(db.String(255))
createdate = db.Column(db.DateTime, default=datetime.utcnow)
updatedate = db.Column(db.TIMESTAMP)
class Sleep(db.Model):
__tablename__ = 'Sleep'
sleep_id = db.Column(db.Integer, primary_key=True)
users_id = db.Column(db.Integer, db.ForeignKey('Users.users_id', ondelete='CASCADE'), nullable=False)
sleep_level = db.Column(db.Integer, nullable=False)
timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
video_url = db.Column(db.String(255))
sleep_time = db.Column(db.Integer)
# Users 테이블과 1:N 관계
users = db.relationship('Users', backref=db.backref('sleeps'))
class Ciga(db.Model):
__tablename__ = 'Ciga'
ciga_id = db.Column(db.Integer, primary_key=True)
users_id = db.Column(db.Integer, db.ForeignKey('Users.users_id', ondelete='CASCADE'), nullable=False)
timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
video_url = db.Column(db.String(255))
smoke_time = db.Column(db.Integer)
# Users 테이블과 1:N 관계
users = db.relationship('Users', backref=db.backref('cigas'))
class Phone(db.Model):
__tablename__ = 'Phone'
phone_id = db.Column(db.Integer, primary_key=True)
users_id = db.Column(db.Integer, db.ForeignKey('Users.users_id', ondelete='CASCADE'), nullable=False)
video_url = db.Column(db.String(255))
timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
using_time = db.Column(db.Integer)
# Users 테이블과 1:N 관계
users = db.relationship('Users', backref=db.backref('phones'))
이렇게 작성하였고 이제 이 코드로 모델을 만들어야한다.
하지만 아까 test.py로 한번 작업을 진행했던 분들은 MySQL에 이미 dms라는 스키마가 있으므로 삭제를 해주고 진행하자..ㅎㅎ
드롭에서 Drop Now로 바로 지워주자
그리고 위에 보면 4번째 버튼에 schema만드는 버튼이 있다. 타이어 3개 겹쳐놓은듯한 원통....
그거를 누르고
이렇게 name에 본인이 만들 스키마 이름(나는 dms)을 작성하고 apply해주자
또 apply
finish를 누르면 dms 스키마가 생성됬을것이다.
그리고 작성한 모델을 __init__.py에서 import 해주자
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
import config
db = SQLAlchemy()
migrate = Migrate()
# create_app함수가 app 객체를 생성해 반환하도록 하는 이유는
# app=Flask(__name__)을 전역으로 사용하게되면 오류가 발생하기 때문(순환 참조 오류)
# create_app이 '애플리케이션 팩토리'이다.
# create_app 대신 다른 이름을 사용하면 정상작동하지 않는다.
def create_app():
app = Flask(__name__)
app.config.from_object(config)
# ORM
db.init_app(app)
migrate.init_app(app, db)
# ****여기만 수정
from . import models
# 블루프린트 작업 : Flask에서 URL과 함수의 매핑을 관리하기 위해 사용하는 도구이다.
# 블루프린트를 이용하면 라우팅 함수를 체계적으로 관리할 수 있다.
from .views import main_views
app.register_blueprint(main_views.bp)
return app
다른 코드는 전부 똑같고 ORM에 from . import models만 해주면된다.
그리고 이제 db를 migrate해주고 upgrade해줘야하는데
여기서 또 flask db migrate와 flask db upgrade를 하면 db를 찾을 수 없다고 뜬다...
그래서 어쩔수 없이 다시 run_dms.cmd에 추가해서 실행한다.
각각 한번씩 쓰고 지우면서 작업해줘야지 오류가 안난다.
코드는 한번에 써놨지만 하나씩 넣고 지우고 돌리는걸 추천한다...
@echo off
cd c:/dev/Python/DMS
set FLASK_APP=pybo
set FLASK_DEBUG=true
flask db migrate
flask db upgrade
call C:\Users\KOSA\anaconda3\envs\DMS\Lib\venv\scripts\nt\activate
flask run
pause
flask db migrate 쓰고 run_dms하고 migrate 지우고 upgrade 쓰고 run_dms하고 flask db upgrade 지우기...
이렇게 진행하면 migrate를 진행했을때
이렇게 versions에 py파일이 생긴다.
models를 바탕으로 리비전 파일을 생성한것이라고한다.
그리고 upgrade로 리비전 파일을 실행한다.
그렇게 실행하고 나면 SQLite에서는 db라는 파일이 만들어질 것이지만 우리는 MySQL이라서 db 파일이 따로 생성안되는게 맞으니까 걱정하지 않아도된다.
그리고 MySQL에 들어가보면 dms Table안에 테이블들이 생긴걸 확인할 수 있다.
alembic_version은 내가 안만들었는데?
라고 했는데 데이터베이스 마이그레이션을 관리하기 위해 자동으로 생성하는 테이블이라고한다.
데이터베이스 스키마에 적용된 마이그레이션의 버전을 추적하는데 사용된다고한다.
이를 통해 Alembic은 어떤 마이그레이션 스크립트가 이미 실행되었는지, 그리고 데이터베이스를 최신 상태로 업그레이드하거나 이전 버전으로 다운그레이드 할 때 어떤 스크립트를 실행해야하는지 결정할 수 있다고한다.
그럼 우선 오늘은 여기까지....
'Python' 카테고리의 다른 글
(5) Flask Jinja2를 사용해 표준 HTML과 템플릿 상속 사용하기 (0) | 2023.11.25 |
---|---|
(4) 메인 페이지 및 bootstrap, navbar 설정 (0) | 2023.11.25 |
(2) pycharm에 mysql 불러오기 (2) | 2023.11.22 |
(1) Pycharm에서 Flask 사용하기 (2) | 2023.11.22 |
딥러닝 - 이미지 데이터 전처리 및 학습(2) (2) | 2023.11.02 |