insert into question (subject, content) values ('안녕하세요', '가입 인사드립니다 ^^');
insert into question (subject, content) values ('질문 있습니다', 'ORM이 궁금합니다');
question1 = Question(subject=’안녕하세요’, content='가입 인사드립니다 ^^')
db.add(question1)
question2 = Question(subject=’질문 있습니다’, content='ORM이 궁금합니다')
db.add(question2)
pip install sqlAlchemy
sqlAlchemy
를 사용한다.from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./myapi.db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
SQLALCHEMY_DATABASE_URL
: Database 접속 주소SessionLocal
: Database 접속을 위한 Classcreate_engine
은 커넥션 풀을 생성하며 커넥션 풀이란 DB에 접속하는 객체 수를 미리 만들어서 돌려가며 사용하는 것을 말한다. 이를 통해 DB 접속 세션 제어, 세션 접속에 소요되는 시간 절감이라는 이점을 얻는다.먼저, 각 도메인에 대한 모델 속성을 구상한다.
from sqlalchemy import Column, Integer, String, Text, DateTime
from database import Base
class Question(Base):
__tablename__ = "question"
id = Column(Integer, primary_key=True)
subject = Column(String, nullable=False)
content = Column(Text, nullable=False)
create_date = Column(DateTime, nullable=True)
tablename
: 관리될 테이블 명Column
의 첫 인자는 DataType이며 primary_key
, nullable
을 설정할 수 있다. primary_key
: 중복된 값을 없게 만들어주는 설정, 기본 키로 설정하면, Data type이 Integer인 경우, 값이 자동으로 증가하는 속성이 있어서 데이터 저장 시, 세팅하지 않아도 1씩 자동 증가한다.nullable
: 데이터 저장 시 null 값 허용 여부. default는 True다.from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from database import Base
...
class Answer(Base):
__tablename__ = "answer"
id = Column(Integer, primary_key=True)
content = Column(Text, nullable=False)
create_date = Column(DateTime, nullable=False)
question_id = Column(Integer, ForeignKey("question.id"))
question = relationship("Question", backref="answers")
question_id
은 질문을 답변과 연결하기 위한 속성이다. 또한 이럴 때는 ForeignKey
를 사용해야한다. 이는 database에서 기존 model과 연결된 속성을 나타내는 것을 의미한다.ForeignKey
에서 question.id
는 question table의 id Column을 의미한다. 이를 통해 question_id
는 question
table의 id Column과 연결된 것이다.question
속성은 질문 모델을 참조하기 위한 수단이다.relationship
사용 시, answer.question.subject
이런 식으로 참조/접근이 가능해 지는 것이다. 첫 파라미터는 참조할 모델 명이고, 두 번째 backref
는 역 참조 설정이다. question에 여러 answer가 달릴 수 있는데, 역참조를 하면, question에 대한 answer들을 a_question.answers
와 같은 코드로 참조할 수 있다.pip install alembic
alembic init migrations
.
├── alembic.ini
├── database.py
├── frontend
├── main.py
├── migrations
├── models.py
├── README.md
└── requirements.txt
migrations
directory는 revision 파일을 저장하는 용도다.alembic.ini
file은 alembic 설정을 위한 파일이다....
sqlalchemy.url = sqlite:///./myapi.db
...
sqlalchemy.url
을 우리가 사용할 db 주소로 바꿔준다....
import models
...
target_metadata = models.Base.metadata
...
alebic revision --autogenerate
alembic upgrade head