flask에서 sqlalchemy 연동에 애를 먹어 까먹지 않기 위해 기록
pycharm이 아닌 local terminal 조작
터미널은 해당 경로에 들어가 있을 것.
cd [flask 폴더 경로]
pip install flask-sqlalchemy
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 이름
Product.query.all()
db.session.close()
terminal에서 “db.create_all()”을 입력하면, flask에 자동으로 db가 생성된다.
그런데 자동으로 생성된 DB의 인코딩에 문제가 생긴건지 위의 사진처럼 나온다.
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)
에러가 뜬다.
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이 보인다.
⇒ 같은 에러가 뜨며,
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.
가 뜬다.
⇒ Integrity Error가 뜬다.
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'
⇒ 다시 에러
<그 외에도 몇번의 시도를 했으나 작성하지 못했다ㅜㅜ>
튜토리얼 무조건 따라하다가 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에도 예쁘게 연동 끝!!!!!!!