[Error 일기] Flask - MySQL 연동하기

Zero·2022년 8월 18일
0

Flask

목록 보기
1/1

flask에서 sqlalchemy 연동에 애를 먹어 까먹지 않기 위해 기록

pycharm이 아닌 local terminal 조작

터미널은 해당 경로에 들어가 있을 것.

cd [flask 폴더 경로]

Import

pip install flask-sqlalchemy

DB 연동 <Mysql은 아래에 있음>

python3
>> from market import db
>> db.create_all()
>> from market import Product
>> product1 = Product(pname="Banana", detail="This is a Banana", price=500, image="no img")
>> db.session.add(product1)
>> db.session.commit()

✅  market : python file 이름

✅  Product : Model 이름

DB 내부 확인

Product.query.all()

연동 후

db.session.close()

🔥이슈 발생

상황 1)

terminal에서 “db.create_all()”을 입력하면, flask에 자동으로 db가 생성된다.

그런데 자동으로 생성된 DB의 인코딩에 문제가 생긴건지 위의 사진처럼 나온다.

상황 2)

product DB에,

product1 = Product(pname="Banana", detail="This is a Banana", price=500, image="no img")
product2 = Product(pname="Lime", detail="This is a Lime", price=750, image="no img")

를 넣었으나, commit을 하는 것은 product1 뿐이고, product2를 넣었을 땐,

[SQL: INSERT INTO product (pname, detail, price, image) VALUES (?, ?, ?, ?)]
[parameters: ('Lime', 'This is a Lime', 750, 'no img')]
(Background on this error at: https://sqlalche.me/e/14/gkpj)

에러가 뜬다.

상황 3)

class Product(db.Model):
    pnum   = db.Column(db.Integer(), primary_key=True)
    pname  = db.Column(db.String(length=30), nullable=False, unique=True)
    detail = db.Column(db.String(length=1024), nullable=False, unique=True)
    price  = db.Column(db.Integer(), nullable=False)
    image  = db.Column(db.String(length=1024), nullable=False, unique=True)

    def __rerp__(self):
        return f"Product {self.pname}"

__rerp__ 를 실행하면 pname이 보여야 정상인데, 여전히 product1이 보인다.


나의 시도

1. DB를 먼저 짜지 않아 일어난 일로 생각하여, DB를 먼저 짜보았다.

⇒ 같은 에러가 뜨며,

2.1 Error: Could not locate a Flask application. 
You did not provide the "FLASK_APP" environment variable, 
and a "wsgi.py" or "app.py" module was not found in the current directory.

가 뜬다.

2. Flask 경로를 다시 지정해주었다.

⇒ Integrity Error가 뜬다.

3. Integrity Error 해결을 위해 try / excxept문 사용하기

from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import session

try:
    session.flush()
except IntegrityError:
    session.rollback()
AttributeError: module 'sqlalchemy.orm.session' has no attribute 'flush'

⇒ 다시 에러

<그 외에도 몇번의 시도를 했으나 작성하지 못했다ㅜㅜ>


4. SQL 프로그램 체크 ⇒ 해결

튜토리얼 무조건 따라하다가 12시간이 사라지는 magic을 경험했다.

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///market_db.db'

sqlite가 아니라… mysql을 연동했어야 맞다.

# pymysql 설치
pip3 install pymysql

# project source에서 가장 top level file __init__.py에 아래 code 를 넣어주면 된다.
import pymysql
pymysql.install_as_MySQLdb()
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[비밀번호]@localhost:[root번호]/[db이름]'

그래서 terminal 실행도 달라진다.

sql에도 예쁘게 연동 끝!!!!!!!

profile
코딩 일기

0개의 댓글