SQLAlchemy Join #3 One to One

One To One 일대일 관계에서는 양쪽 매퍼에서 스칼라 속성을 통한 양방향 관계가 필수적이다. 이것을 위해서 uselist flag 가 있는데 이것은 많은쪽("many” side of the relationship.)의 컬랙션 대신에 스칼라 속성의 위치를 가리킨다. 일대다 를 일대일로 바꾸면, class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child = relationship("Child", uselist=False, back_populates="parent") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship("Parent", back_populates="child") 다대일의 경우, class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=Tru

SQLAlchemy Join #2 Many To One

Many To One 다대일 관계에서 child 를 참조하는 외래키는 parent 클래스에 위치해있다. relationship() 함수 는 parent 클래스에 위치해있으며, scalar-holding 속성이 생성될것이다. class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child_id = Column(Integer, ForeignKey('child.id')) child = relationship("Child") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) 양방향 연결을 두번째 relationship() 를 추가하고 양쪽에relationship.back_populates 파라미터를 양쪽에 적용하면 된다. class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) child_id = Column(Integer, ForeignKey('child.id')) child = relationship("Child", back_populates="parents") class Child(Base):

SQLAlchemy Join #1 One To Many

SQLAlchemy Join 에 대해서 막연하게 쓰다보니 여러가지 관계 테이블상황에서 제대로 사용하지 못하고 수박겉핣기식으로 쓰는 경우가 많았다. 그래서 공식 문서상의 Join 관련 부분(아래의 URL)을 따라하면서 막히는 부분을 풀어보고자 한다. http://docs.sqlalchemy.org/en/latest/orm/relationships.html Basic Relationship Patterns One To Many(일대다) 일대다 관계는 parent 를 참조하는 외래키를 child 테이블에 준다. child 의 컬렉션을 가져오기 위해서 relationship() 함수는 parent 에 위치시킨다. class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child") class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) def __repr__(self): return str({ 'id': self.id,

SQLAlchemy autocommit 에 대해서

DB 상에서 autocommit 이란 데이터 변경 작업에 대한 SQL 자체가 바로 반영되는 것을 의미하는데 autocommit 이 아닌 상태에서는 여러줄의 명령을 하나의 트랜잭션으로 묶을수가 있다.(개별 DBMS 엔진이나 DB타입에 따라 다를수는 있다. 여기에서는 MYSQL InnoDB 기반으로 테스트를 진행하였다.) mysql autocommit 확인하기 SELECT @@AUTOCOMMIT; mysql autocommit 설정/해제 하기 SET AUTOCOMMIT = TRUE; // AUTOCOMMIT 설정 SET AUTOCOMMIT = FALSE; // AUTOCOMMIT 해제 COMMIT; // 커밋 ROLLBACK; // 롤백 테스트 SET AUTOCOMMIT = FALSE; insert into test.tb_category values(9, null, null, '테스트', 0); commit; # commit 을 해야 반영된 것이 보인다. SQLAlchemy 의 autocommit 설정 아래는 기본적인 SQLAlchemy 에 나오는 트랜잭션 관련 설명을 (발)번역한 내용이다. Using Transactions Connection

flask-sqlalchemy multiple databases

사용하기 flask-sqlalchemy 에서 기본적으로 SQLALCHEMY_DATABASE_URI 설정을 통해서 mapping class 에 정의된 테이블들이 DB와 연결되게 된다. 그런데 1개 이상의 DB와 연결해야하는 경우가 생긴다. 기존의 회원정보를 같이 쓰는 다른 서비스의 경우가 대표적인 케이스이다. 이럴경우, flask-sqlalchemy 에서는 SQLALCHEMY_BINDS 를 통해서 여러 데이터베이스 URI를 지정할 수 있게 해주고 있다. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/test1' app.config['SQLALCHEMY_BINDS'] = { 'test2': 'mysql+pymysql://root:root@localhost:3306/test2', 'test1': 'mysql+pymysql://root:root@localhost:3306/test1' } 위의 설정을 보면, SQLALCHEMY_DATABASE_URI 를 지정하면서 SQLALCHEMY_BINDS 를 지정하고 있다. SQLALCHEMY_BINDS 는 키-값 형태로 지정하면 되는데, test1, test2 와 같이 지정을 해두었다. SQLALCHEMY_DATABASE_URI 에 지정한 값은 디폴트 값으로 지정되게 된다. class User(db.Model): __tablename__ = "tb_user" __bind_key__ = 'test2' id =

SQLAlchemy with StoreProcedure

(adsbygoogle = window.adsbygoogle || []).push({}); 제목자체가 역설적이지만, 이렇게 써야 할때가 있다. 예를들면, 레거시를 다시 재개발하는 수준에서 특정 프로시저는 단순히 db를 조회하는 것 이상의 프로그래밍적인 기능을 가지고 있을때가 있다. 또한, 다른 이유로 ORM인 SQLAlchemy와 저장프로시저를 혼합해야할 때가 있는데, 그럴때 따로 저장프로시저용 코드를 쓰기 보다는 SQLAlchemy 를 이용해서 프로시저를 실행하고 값을 가져오는 것이 좋다. 개인적으로 SQLAlchemy를 써서 좋다고 생각하는 이유는 유지보수 하는 입장에서 DB연결 문자열 등과 같은 관리포인트도 하나로 유지하면 좋고, ORM 외에 몇개의 프로시저를 위해서 DB연결 라이브러리에 종속적인 코드를 짜고 싶지 않다는 것을 느꼈다.(안된다는 것이 아니다.) 위의 코드는 Flask-SQLAlchemy 로 짠 코드인데, 일반 SQLAlchemy를 아시는 개발자라면 쉽게 이해할 수 있는 코드이다. 다른 것보다도 raw_connection() 함수에 대해서 설명하자면 프록시된 DBAPI 연결 객체를