Hi again,

I finally replaced my many-to-many relations with an association object :

(truncated for legibility)

languages = Table('languages', meta,
    Column('id', Integer, primary_key=True),
    Column('iso_code', String(2)),
    Column('language', String(100)))

invasives = Table('invasives', meta,
    Column('id', Integer, primary_key=True))

species_names = Table('species_names', meta,
    Column('id', Integer, primary_key=True),
    Column('name', String(200)))

invasive_names = Table('invasive_names', meta,
    Column('language_id', Integer, ForeignKey('languages.id')),
    Column('invasive_id', Integer, ForeignKey('invasives.id')),
    Column('name_id', Integer, ForeignKey('species_names.id')))

#########
# MAPPERS #
#########

mapper(SpeciesName, species_names)
mapper(InvasiveName, invasive_names,
    primary_key = [invasive_names.c.invasive_id, 
invasive_names.c.name_id, invasive_names.c.language_id],
    properties = {
        'name' : relation(SpeciesName, lazy=True, cascade='all, 
delete-orphan'),
        'language' : relation(Language, lazy=True)
})

mapper(Invasive, invasives, properties = {
    'names' : relation(InvasiveName, lazy=True, association=SpeciesName, 
cascade='all, delete-orphan'),
   
    'scientific_name' : relation(SpeciesName, secondary=invasive_names,
        primaryjoin = invasive_names.c.invasive_id==invasives.c.id,
        secondaryjoin = 
and_(invasive_names.c.name_id==species_names.c.id, 
invasive_names.c.language_id==languages.c.id, 
languages.c.iso_code=='la'), uselist=False)
    }
)

It works fine !, I can do things like:

invasive_object = Invasive()
invasive_name_object = InvasiveName()
language_object = query_language.get_by_iso_code('la')

species_name_object = SpeciesName()
species_name_object.name = 'blablabla'

invasive_name_object.name = species_name_object
invasive_name_object.language = language_object

invasive_object.names.append(invasive_name_object)


However, there is one thing that doesn't work : when I delete an 
Invasive, the corresponding InvasiveName is deleted (association), but 
_not_ the corresponding SpeciesName, even with cascade='all, 
delete-orphan', is it normal ? Do I need to delete it manually with 
session.delete(SpeciesName) ?

Thanks !

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to