4 messages in com.googlegroups.sqlalchemy[sqlalchemy] many to many on another ...
FromSent OnAttachments
Dennis Schulz26 Dec 2006 20:33 
Michael Bayer27 Dec 2006 08:20 
dischdennis27 Dec 2006 12:49 
Michael Bayer27 Dec 2006 14:33 
Subject:[sqlalchemy] many to many on another many to many
From:Dennis Schulz (d.sc@gmx.net)
Date:12/26/2006 08:33:32 PM
List:com.googlegroups.sqlalchemy

Hi, <mailto:sqla@googlegroups.com>

I have the use case to map a many to many relation on a existing many to many relation. (Means I want to assign a connection table with 2 primary keys to a connection table with 3 primary keys) I tried a lot of things but nothing seems to work.

Basically, I have a Purchase Requisition Object on that can be assigned various (Cost Center ID / Budget ID) Pairs.(means a connection table)

I map the connection tables to associationObjects and tried to use the AssociationProxy Extension and map a List "assignedBCCs" to the Purchase Requisition Object, so I can (theoretically) directly assign BCC Objects without using the Association....(what I thought)

Read access works, and manipulations on the assignedBCCs list seem to work on the objects, but the changes are not written into the DB.

Anyone has experiences with this kind of relationship?

Here the corresponding code. I am sorry, it is not a complete working testcase, and the tables are only MySql without the foreign keys. (only the output of the dbdesigner...) Nevertheless, until this point I implemented working 1:n and n:1 relationships on the tables and this shouldn't be the reason why it is not working.

Thank you for any help. Dennis

---------------------------------------------------------------------------------------------------------------------- tables

---------------------------------------------------------------------------------------------------------------------- CREATE TABLE `pr_PurchaseRequisition` ( `pr_PurchaseRequisition_ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY(`pr_PurchaseRequisition_ID`) ) TYPE=InnoDB;

CREATE TABLE `pr_PurchaseRequisition_has_CELLS_budget_has_CELLS_costCenter` ( `pr_PurchaseRequisition_ID` INTEGER UNSIGNED NOT NULL, `CELLS_costCenter_ID` INTEGER UNSIGNED NOT NULL, `CELLS_budget_ID` INTEGER UNSIGNED NOT NULL, `percentage` FLOAT NULL, PRIMARY KEY(`pr_PurchaseRequisition_ID`, `CELLS_costCenter_ID`, `CELLS_budget_ID`) ) TYPE=InnoDB;

CREATE TABLE `CELLS_budget_has_CELLS_costCenter` ( `CELLS_budget_ID` INTEGER UNSIGNED NOT NULL, `CELLS_costCenter_ID` INTEGER UNSIGNED NOT NULL, PRIMARY KEY(`CELLS_budget_ID`, `CELLS_costCenter_ID`) ) TYPE=InnoDB;

CREATE TABLE `CELLS_budget` ( `CELLS_budget_ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `budgetCode` VARCHAR(10) NULL, `name` VARCHAR(100) NULL, PRIMARY KEY(`CELLS_budget_ID`) ) TYPE=InnoDB;

CREATE TABLE `CELLS_costCenter` ( `CELLS_costCenter_ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `CELLS_division_ID` INTEGER UNSIGNED NOT NULL, `name` VARCHAR(45) NULL, `budgetCode` VARCHAR(10) NULL, PRIMARY KEY(`CELLS_costCenter_ID`) ) TYPE=InnoDB;

CREATE TABLE `CELLS_division` ( `CELLS_division_ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NULL, PRIMARY KEY(`CELLS_division_ID`) ) TYPE=InnoDB;

---------------------------------------------------------------------------------------------------------------------- models

----------------------------------------------------------------------------------------------------------------------

class PRBudgetCostCenterAssociation(object): pass

class BudgetCostCenterAssociation(object): pass

def create_BCC(BCC): new = PRBudgetCostCenterAssociation() new.budgetCostCenter = BCC return new

class PurchaseRequisition( DomainRecord ): implements(IPurchaseRequisition) assignedBCCs = AssociationProxy('purchaseRequisitionBudgetCostCenter', 'budgetCostCenter', creator=create_BCC)

def create_budget_association(budget): ka = KeywordAssociation() ka.keyword = keyword return ka

class CELLSCostCenter( DomainRecord ):

implements( ICELLSCostCenterTable ) assignedBudgets = AssociationProxy('associatedBudgets', 'budget', creator=create_budget_association)

class PRHasBudgetHasCostCenter( DomainRecord ):

implements( IPRHasBudgetHasCostCenterTable )

class CELLSBudget( DomainRecord ):

implements( ICELLSBudgetTable )

class CELLSBudgetHasCostCenter( DomainRecord ):

implements( ICELLSBudgetHasCostCenterTable )

---------------------------------------------------------------------------------------------------------------------- mappers

----------------------------------------------------------------------------------------------------------------------

budget_mapper = bind_mapper( app_model.CELLSBudget, app_schema.CELLSBudgetTable)

cost_center_mapper = bind_mapper( app_model.CELLSCostCenter, app_schema.CELLSCostCenterTable, properties={ 'associatedBudgets' : relation(app_model.BudgetCostCenterAssociation, lazy=False, cascade="save-update"), 'division': relation(app_model.CELLSDivision, lazy=True), })

mapper(app_model.BudgetCostCenterAssociation, app_schema.CELLSBudgetHasCostCenterTable,

primary_key=[app_schema.CELLSBudgetHasCostCenterTable.c.CELLS_costCenter_ID,

app_schema.CELLSBudgetHasCostCenterTable.c.CELLS_budget_ID], properties={ 'budget' : relation(app_model.CELLSBudget, lazy=False) , } )

mapper(app_model.PRBudgetCostCenterAssociation, app_schema.PRHasBudgetHasCostCenterTable,

primary_key=[app_schema.PRHasBudgetHasCostCenterTable.c.pr_PurchaseRequisition_ID,

app_schema.PRHasBudgetHasCostCenterTable.c.CELLS_costCenter_ID,

app_schema.PRHasBudgetHasCostCenterTable.c.CELLS_budget_ID], properties={ 'budgetCostCenter' : relation(app_model.BudgetCostCenterAssociation, lazy=False, cascade="save-update"), } )

purchaseRequisition_mapper = bind_mapper( app_model.PurchaseRequisition, app_schema.PurchaseRequisitionTable,

properties={

'purchaseRequisitionBudgetCostCenter' :

relation(app_model.PRBudgetCostCenterAssociation, lazy=False, cascade="save-update"), })