2017-12-21 1 views
0

단위 테스트를 수행하는 동안 외국 제약 때문에 통과하지 못한다는 것을 알고있는 몇 가지 코드를 작성했습니다. I은 PK id 및 PK ID 및 Test1.id를 참조 Test2.link에 FK의 constrainst 갖는 제 2 테이블 Test2와 간단한 데이터베이스 테이블 Test1 선언왜 sqlalchemy는 sqlite로 FK constrainst를 우회합니까?

import os 
import sqlalchemy as sa 
from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.ext.declarative import declarative_base, declared_attr 
import logging 
logging.basicConfig() 
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) 

try: 
    os.unlink('test.db') 
except: 
    pass 
engine = create_engine('sqlite:///test.db') 

Base = declarative_base() 

class Test1(Base): 
    __tablename__ = 'Test1' 
    id = sa.Column(sa.Integer(), primary_key = True) 

class Test2(Base): 
    __tablename__ = 'Test2' 
    id = sa.Column(sa.Integer(), primary_key = True) 
    link = sa.Column(sa.Integer(), sa.ForeignKey(Test1.id), index = True) 

Base.metadata.create_all(engine) 

Session = sessionmaker() 

session = Session(bind=engine) 

session.add(Test2(id=1, link=2)) # <-- should raise an error because 2 not in Test1 
session.commit() 
session.add(Test1(id=1)) 
session.commit() 
session.add(Test2(id=2, link=1)) #ok 
session.commit() 
session.add(Test2(id=3, link=42)) # <-- should raise an error because 42 not in Test1 
session.commit() 

:

는 일례이다. 그런 다음 FK를 깨는 값을 삽입합니다.

FK는 SQLAlchemy의이 FK를 우회하는 방법 나는 SQLite는 DB 브라우저, 나는이 같은 값을 넣을 수 없습니다를 열면 때문에 작동하는 것 같다 ...

왜와?

참고 : 나는

답변

1

당신이 SQLite는에 집행 켰습니까 다른 DB에 시도하지 않은?

> PRAGMA foreign_keys = ON; 

related question을 참조하십시오. 코드에서이를 사용하려면, 하나는

engine = create_engine(database_url) 
engine.execute('PRAGMA foreign_keys=ON') 

other answer이 연결에서 실행 청취자/이벤트를 사용하는 예제가 사용할 수 있습니다.

def _fk_pragma_on_connect(dbapi_con, con_record): 
    dbapi_con.execute('PRAGMA foreign_keys=ON') 

from sqlalchemy import event 
event.listen(engine, 'connect', _fk_pragma_on_connect) 
+0

니스! 나는 잘못된 질문을 인터넷 검색에 집착했다. 나는 현명하게 보이는이 솔루션을 채택했다 : https://stackoverflow.com/a/15542046/1745291 –