Hi Mike, In case you haven't been following the SO question, I've added another answer which is basically Erwin's solution done with SQLAlchemy. Feel free to use all or part of the code I've put up in any additions you make to the SQLA docs. I think people could really benefit from seeing the complete code for such a use case.
Cheers, Cam Cameron Jackson Engineering Intern Air Operations Thales Australia Thales Australia Centre, WTC Northbank Wharf, Concourse Level, Siddeley Street, Melbourne, VIC 3005, Australia Tel: +61 3 8630 4591 cameron.jack...@thalesgroup.com.au<mailto:cameron.jack...@thalesgroup.com.au> | www.thalesgroup.com.au<http://www.thalesgroup.com.au> From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com] On Behalf Of Michael Bayer Sent: Wednesday, 7 December 2011 1:19 AM To: sqlalchemy@googlegroups.com Subject: Re: [sqlalchemy] Complex foreign key constraint yes, I had an intuition that a composite FK could do it as I've seen that approach before, but I couldn't figure it out. we have test coverage for cases exactly like that as well and I think I may even add this to the docs. On Dec 6, 2011, at 12:17 AM, Jackson, Cameron wrote: Just to follow up on this again: I asked the question at Stack Overflow as well, and someone showed me how I can accomplish this in SQL using a compound foreign key: http://stackoverflow.com/a/8395021/665488 Now I just have to convert his SQL into SQLAlchemy declarative syntax and I'll have a nice clean solution. Cameron Jackson Engineering Intern Air Operations Thales Australia Thales Australia Centre, WTC Northbank Wharf, Concourse Level, Siddeley Street, Melbourne, VIC 3005, Australia Tel: +61 3 8630 4591 cameron.jack...@thalesgroup.com.au<mailto:cameron.jack...@thalesgroup.com.au> | www.thalesgroup.com.au<http://www.thalesgroup.com.au/> From: sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com> [mailto:sqlalchemy@googlegroups.com] On Behalf Of Jackson, Cameron Sent: Tuesday, 6 December 2011 1:29 PM To: sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com> Subject: RE: [sqlalchemy] Complex foreign key constraint Thanks Mike. Might put this on the back-burner for now, and I'll look into it again when I get the time. Cheers. Cameron Jackson Engineering Intern Air Operations Thales Australia Thales Australia Centre, WTC Northbank Wharf, Concourse Level, Siddeley Street, Melbourne, VIC 3005, Australia Tel: +61 3 8630 4591 cameron.jack...@thalesgroup.com.au<mailto:cameron.jack...@thalesgroup.com.au> | www.thalesgroup.com.au<http://www.thalesgroup.com.au/> From: sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com> [mailto:sqlalchemy@googlegroups.com] On Behalf Of Michael Bayer Sent: Tuesday, 6 December 2011 1:13 PM To: sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com> Subject: Re: [sqlalchemy] Complex foreign key constraint On Dec 5, 2011, at 7:40 PM, Jackson, Cameron wrote: I have two tables, SystemVariables and VariableOptions. SystemVariables is self-explanatory, and VariableOptions contains all of the possible values for all of the variables. VariableOptions has a foreign key, variable_id, which states which variable it is an option for. SystemVariables has a foreign key, choice_id, which states which option is the currently selected one. I've gotten around the cyclic relationship using use_alter on choice_id, and post_update on SystemVariables' choice relationship. However, I would like to add an extra database constraint that will ensure that choice_id is valid. The logic I need, assuming that sysVar represents a row in the SystemVariables table, is basically: VariableOptions[sysVar.choice_id].variable_id == sysVar.id But I don't know how to construct this kind of constraint using SQL, declarative, or any other method. If necessary I could just validate this at the application level, but I'd like to have it at the database level if possible. I'm using Postgres 9.1. you'd need to create an INSERT/UPDATE trigger that invokes a procedure which will perform the check via SELECT, this is the pseudcode version: assert SELECT inserted.choice_id in (select id from variable_options where variable_id=inserted.id) when you write a trigger you get access to variables like "inserted" and "updated" which indicate the row in question. the mechanics of writing the procedure and raising an exception in PG aren't syntaxes I know off the top of my head, you'd start with the TRIGGER stuff at http://www.postgresql.org/docs/9.0/static/sql-createtrigger.html -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com>. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com<mailto:sqlalchemy+unsubscr...@googlegroups.com>. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en. ------------------------------------------------------------------------- DISCLAIMER: This e-mail transmission and any documents, files and previous e-mail messages attached to it are private and confidential. They may contain proprietary or copyright material or information that is subject to legal professional privilege. They are for the use of the intended recipient only. Any unauthorised viewing, use, disclosure, copying, alteration, storage or distribution of, or reliance on, this message is strictly prohibited. No part may be reproduced, adapted or transmitted without the written permission of the owner. If you have received this transmission in error, or are not an authorised recipient, please immediately notify the sender by return email, delete this message and all copies from your e-mail system, and destroy any printed copies. Receipt by anyone other than the intended recipient should not be deemed a waiver of any privilege or protection. Thales Australia does not warrant or represent that this e-mail or any documents, files and previous e-mail messages attached are error or virus free. ------------------------------------------------------------------------- -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com>. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com<mailto:sqlalchemy+unsubscr...@googlegroups.com>. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en. ------------------------------------------------------------------------- DISCLAIMER: This e-mail transmission and any documents, files and previous e-mail messages attached to it are private and confidential. They may contain proprietary or copyright material or information that is subject to legal professional privilege. They are for the use of the intended recipient only. Any unauthorised viewing, use, disclosure, copying, alteration, storage or distribution of, or reliance on, this message is strictly prohibited. No part may be reproduced, adapted or transmitted without the written permission of the owner. If you have received this transmission in error, or are not an authorised recipient, please immediately notify the sender by return email, delete this message and all copies from your e-mail system, and destroy any printed copies. Receipt by anyone other than the intended recipient should not be deemed a waiver of any privilege or protection. Thales Australia does not warrant or represent that this e-mail or any documents, files and previous e-mail messages attached are error or virus free. ------------------------------------------------------------------------- -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com<mailto:sqlalchemy@googlegroups.com>. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com<mailto:sqlalchemy+unsubscr...@googlegroups.com>. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en. ------------------------------------------------------------------------- DISCLAIMER: This e-mail transmission and any documents, files and previous e-mail messages attached to it are private and confidential. They may contain proprietary or copyright material or information that is subject to legal professional privilege. They are for the use of the intended recipient only. Any unauthorised viewing, use, disclosure, copying, alteration, storage or distribution of, or reliance on, this message is strictly prohibited. No part may be reproduced, adapted or transmitted without the written permission of the owner. If you have received this transmission in error, or are not an authorised recipient, please immediately notify the sender by return email, delete this message and all copies from your e-mail system, and destroy any printed copies. Receipt by anyone other than the intended recipient should not be deemed a waiver of any privilege or protection. Thales Australia does not warrant or represent that this e-mail or any documents, files and previous e-mail messages attached are error or virus free. ------------------------------------------------------------------------- -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.