SQLAlchemy에서 declarative_base()와 db.Model의 차이점
사용 방법은 다음과 같습니다.
from sqlalchemy import declarative_base
Base = declarative_base()
위 코드는 Base
라는 이름의 기본 클래스를 생성합니다. 이 클래스는 모든 데이터 모델 클래스의 상위 클래스로 사용됩니다.
데이터 모델 클래스를 정의하려면 Base
를 상속받는 클래스를 만들고, 각 열을 나타내는 속성을 정의합니다. 예를 들어, 다음 코드는 User
라는 이름의 데이터 모델 클래스를 정의합니다.
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
email = Column(String(255))
위 코드는 users
라는 이름의 테이블을 만들고, id
, name
, email
이라는 세 개의 열을 정의합니다. id
열은 기본 키이며, name
과 email
열은 문자열입니다.
db.Model
은 Flask-SQLAlchemy 확장의 일부이며, declarative_base()
와 유사한 기능을 제공합니다. 하지만 db.Model
은 다음과 같은 몇 가지 추가 기능을 제공합니다.
- 자동 테이블 이름 생성: 테이블 이름을 명시적으로 지정하지 않으면
db.Model
은 클래스 이름을 기반으로 테이블 이름을 자동으로 생성합니다. - 쿼리 속성:
db.Model
클래스에는query
속성이 있으며, 이를 사용하여 해당 클래스의 인스턴스를 쿼리할 수 있습니다.
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(Integer, primary_key=True)
name = db.Column(String(255))
email = db.Column(String(255))
위 코드는 Flask 응용 프로그램을 초기화하고 SQLAlchemy 확장을 설정합니다. 그런 다음 User
라는 이름의 데이터 모델 클래스를 정의합니다. 이 클래스는 db.Model
을 상속받으므로 declarative_base()
를 사용하는 경우와 동일한 기능을 제공합니다.
요약
declarative_base()
와 db.Model
은 모두 SQLAlchemy에서 데이터 모델을 정의하는 데 사용되는 유용한 도구입니다. db.Model
은 declarative_base()
와 동일한 기능을 제공하며, 자동 테이블 이름 생성 및 쿼리 속성과 같은 추가 기능을 제공합니다.
따라서 Flask-SQLAlchemy를 사용하는 경우 db.Model
을 사용하는 것이 일반적입니다. 하지만 declarative_base()
를 직접 사용하는 것을 선호하는 경우도 있습니다.
어떤 것을 사용해야 할까요?
다음은 declarative_base()
와 db.Model
중 어떤 것을 사용해야 할지 결정하는 데 도움이 되는 몇 가지 지침입니다.
- Flask-SQLAlchemy를 사용하는 경우
db.Model
을 사용하십시오. - 테이블 이름을 직접 제어해야 하는 경우
declarative_base()
를 사용하십시오. - 사용자 정의 쿼리 작성기 또는 기타 고급 기능을 사용해야 하는 경우
declarative_base()
를 사용하십시오.
예제 코드
예제 1: declarative_base()
사용
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///example.db')
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
email = Column(String(255))
Base.metadata.create_all(engine)
이 코드는 다음을 수행합니다.
sqlite:///example.db
라는 이름의 SQLite 데이터베이스에 대한 엔진을 만듭니다.Base
라는 이름의 기본 클래스를 생성합니다.User
라는 이름의 데이터 모델 클래스를 정의합니다.users
라는 이름의 테이블을 만들고,id
,name
,email
이라는 세 개의 열을 정의합니다.id
열은 기본 키이며,name
과email
열은 문자열입니다.- 데이터베이스에 테이블을 만듭니다.
예제 2: db.Model
사용
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(Integer, primary_key=True)
name = db.Column(String(255))
email = db.Column(String(255))
@app.route('/')
def index():
users = User.query.all()
return '<h1>Users</h1><ul>' + ''.join(['<li>' + user.name + '</li>' for user in users]) + '</ul>'
if __name__ == '__main__':
app.run()
- Flask 응용 프로그램을 초기화하고 SQLAlchemy 확장을 설정합니다.
/
경로에 대한 루트를 정의합니다.- 루트 핸들러는 모든 사용자를 쿼리하고 이름을 나열하는 HTML 페이지를 반환합니다.
- 응용 프로그램을 실행합니다.
이 예제는 Flask-SQLAlchemy를 사용하여 데이터 모델을 정의하고 기본 웹 응용 프로그램을 만드는 방법을 보여줍니다.
- 직접 테이블 정의:
Table
클래스를 사용하여 테이블을 직접 정의할 수 있습니다. 이 방법은 더 많은 제어력을 제공하지만, 코드가 더 복잡해질 수 있습니다. - SQLAlchemy Mixins:
mixins
를 사용하여 데이터 모델 클래스에 공통 기능을 추가할 수 있습니다. 예를 들어,TimeStampMixin
믹신을 사용하여created_at
및updated_at
열을 자동으로 추가할 수 있습니다. - 기타 ORM: SQLAlchemy 외에도 Pony, Ocelot, SqlObject와 같은 다른 ORM을 사용할 수 있습니다. 각 ORM에는 고유한 장점과 단점이 있으므로, 프로젝트에 가장 적합한 ORM을 선택하는 것이 중요합니다.
다음은 대체 방법 중 어떤 것을 사용해야 할지 결정하는 데 도움이 되는 몇 가지 지침입니다.
- 간단한 데이터 모델을 사용하는 경우
declarative_base()
또는db.Model
을 사용하십시오. - 더 많은 제어력이 필요한 경우 직접 테이블을 정의하십시오.
- 데이터 모델 클래스에 공통 기능을 추가해야 하는 경우 믹신을 사용하십시오.
- SQLAlchemy가 마음에 들지 않는 경우 다른 ORM을 사용하십시오.
결론
declarative_base()
와 db.Model
은 SQLAlchemy에서 데이터 모델을 정의하는 데 사용되는 두 가지 유용한 도구입니다.
어떤 것을 사용해야 할지는 프로젝트의 특정 요구 사항에 따라 달라집니다.
python flask sqlalchemy