У мяне ёсць мадэль / табліца 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