책 '점프 투 플라스크'를 공부하면서 정리한 내용입니다.
출처 : https://wikidocs.net/book/4542
SQLite DB는 ORM을 사용할 때 발생시킬 수 있는 몇 가지 오류가 있다.
SQLite DB에서 사용하는 인덱스 등의 제약 조건 이름은 MetaData 클래스를 사용하여 규칙을 정의해야 한다.
이름을 정의하지 않으면 SQLite DB는 오류를 발생시킴
ValueError: Constraint must have a name
또한 SQLite DB는 migrate.init_app(app, db, render_as_batch=True)에서 지정한 것처럼 render_as_batch 속성을 True로 지정해야 한다.
이 속성이 False라면 다음과 같은 '제약 조건의 변경을 지원하지 않는다'는 오류 발생
ERROR [root] Error: No support for ALTER of constraints in SQLite dialectPlease refer to the batch mode feature which allows for SQLite migrations using a copy-and-move strategy.
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
# --------------------------------- [edit] ---------------------------------- #
from sqlalchemy import MetaData
# --------------------------------------------------------------------------- #
import config
# --------------------------------- [edit] ---------------------------------- #
naming_convention = {
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(column_0_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}
db = SQLAlchemy(metadata=MetaData(naming_convention=naming_convention))
migrate = Migrate()
# --------------------------------------------------------------------------- #
def create_app():
app = Flask(__name__)
app.config.from_object(config)
# ORM
db.init_app(app)
# --------------------------------- [edit] ---------------------------------- #
if app.config['SQLALCHEMY_DATABASE_URI'].startswith("sqlite"):
migrate.init_app(app, db, render_as_batch=True)
else:
migrate.init_app(app, db)
# --------------------------------------------------------------------------- #
from . import models
(... 생략 ...)
위의 __init__.py 파일을 수정하면 DB의 제약 조건 이름이 변경 되므로 flask db migrate 명령과 flask db upgrade 명령으로 DB를 변경해 줘야 한다.
(myproject) c:\projects\myproject>flask db migrate
(myproject) c:\projects\myproject>flask db upgrade