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 브라우저, 나는이 같은 값을 넣을 수 없습니다를 열면 때문에 작동하는 것 같다 ...
왜와?
참고 : 나는
니스! 나는 잘못된 질문을 인터넷 검색에 집착했다. 나는 현명하게 보이는이 솔루션을 채택했다 : https://stackoverflow.com/a/15542046/1745291 –