SQLAlchemy - не ўжываць абмежаванні знешняга ключа ў адносінах

У мяне ёсць мадэль / табліца Test і мадэль / табліца TestAuditLog з выкарыстаннем SQLAlchemy і SQL Server 2008. The сувязь паміж імі Test.id == TestAuditLog.entityId , у адным тэсце шмат журналаў аўдыту. TestAuditLog прызначаны для захавання гісторыі змяненняў радкоў у табліцы Test . Я таксама хачу адсачыць, калі тэст будзе выдалены, але ў мяне праблемы з гэтым. У SQL Server Management Studio я ўстанавіў уласцівасць " Enforce Constraint Key Interstration " адносіны FK_TEST_AUDIT_LOG_TEST Enforce "Увядзенне абмежаванняў знешняга ключа" на "Не", думаючы, што дазволіць існаваць радок TestAuditLog з ідэнтыфікатарам , які больш не падключаецца ні да якога Test.id , таму што тэст быў выдалены. Аднак, калі я спрабую стварыць TestAuditLog з SQLAlchemy, а затым выдаліць Test , я атрымліваю памылку:

(IntegrityError) ('23000', "[23000] [ Microsoft] [Драйвер SQL сервера ODBC] [SQL Server] Немагчыма ўставіць значэнне NULL у слупок "AL_TEST_ID", табліца "TEST_AUDIT_LOG"; у слупку не дапускаюцца нулі. Не ўдалося абнавіць. (515) (SQLExecDirectW); [01000] [Microsoft] [ODBC Driver SQL Server] [SQL Server] Заява была спынена. (3621) ") u'UPDATE [TEST_AUDIT_LOG] SET [AL_TEST_ID] =? ДЗЕ [TEST_AUDIT_LOG]. [AL_ID] =? ' (Няма, 8)

Я думаю, што з-за сувязі знешняга ключа паміж Test і TestAuditLog , пасля таго, як я выдалю радок Test , SQLAlchemy спрабуе абнавіць усе часопісы аўдыту гэтага тэсту, каб мець NULL entityId . Я не хачу, каб гэта зрабіла; Я хачу, каб SQLAlchemy пакінула часопісы аўдыту ў спакоі. Як я магу сказаць SQLAlchemy, каб дазволілі існаваць часопісы аўдыту, чый entityId не злучаецца ні з адным Test.id ?

Я паспрабаваў проста выдаліць ForeignKey з мае табліцы, але я хацеў бы па-ранейшаму мець магчымасць сказаць myTest.audits і атрымаць усе часопісы рэвізіі тэсту, а SQLAlchemy паскардзіўся на тое, што не ведае, як далучыцца Test і TestAuditLog . Затым, калі я ўказаў першаснае злучэнне ​​у адносінах , ён бурчаў, не маючы ForeignKey або ForeignKeyConstraint са слупкамі.

Вось мае мадэлі:

class TestAuditLog(Base, Common):
    __tablename__ = u'TEST_AUDIT_LOG'
    entityId = Column(u'AL_TEST_ID', INTEGER(), ForeignKey(u'TEST.TS_TEST_ID'),
        nullable=False)
    ...

class Test(Base, Common):
    __tablename__ = u'TEST'
    id = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False)
    audits = relationship(TestAuditLog, backref="test")
    ...

І вось як я спрабую выдаліць тэст, захоўваючы яго часопісы аўдыту, іх entityId некранутымі:

    test = Session.query(Test).first()
    Session.begin()
    try:
        Session.add(TestAuditLog(entityId=test.id))
        Session.flush()
        Session.delete(test)
        Session.commit()
    except:
        Session.rollback()
        raise

14
задан Sarah Vessels 18 August 2011 в 15:37
поделиться