Ok it works like this, thanks !
Michael Bayer wrote:
> the "clear()" method on the "keywords" list is blowing away all the
> stored history (that method, as well as the HistoryArraySet its
> attached to, is going away in the next release). I just added a unit
> test to make sure what youre trying to do works. do it like this:
>
> invasive_objects.habitat = []
>
>
>
> On Jun 14, 2006, at 8:35 AM, Julien Cigar wrote:
>
>> (sorry if this message appears twice ...)
>>
>> Hi,
>>
>> I'm using SQLAlchemy 2.2 in a mod_python application, with a "home made"
>> handler.
>> Here are my tables / mappers definitions:
>>
>> ###########################
>>
>> # application/models/__init__.py
>>
>> from datetime import datetime
>>
>> from sqlalchemy import *
>>
>> from application.models.invasive import Invasive, InvasiveName,
>> InvasiveGroup, InvasiveSubGroup
>> from application.models.language import Language
>> from application.models.habitat import Habitat
>> from application.models.origin import Origin
>> from application.models.user import User, UserPermission
>>
>> from application import configuration
>>
>> db_engine = create_engine(configuration.main.DB_DSN, encoding='utf-8')
>>
>> meta = BoundMetaData(db_engine)
>>
>> languages = Table('languages', meta,
>> Column('id', Integer, primary_key=True),
>> Column('iso_code', String(2)),
>> Column('language', String(100)))
>> users = Table('users', meta,
>> Column('id', Integer, primary_key=True),
>> Column('login', String(50)),
>> Column('password', String(32)),
>> Column('first_name', String(100)),
>> Column('name', String(100)),
>> Column('email', String(100)))
>>
>> user_permissions = Table('user_permissions', meta,
>> Column('user_id', Integer, ForeignKey('users.id'), primary_key=True),
>> Column('perm_invasive', String(50)),
>> Column('perm_users', String(50)))
>>
>> invasives = Table('invasives', meta,
>> Column('id', Integer, primary_key=True),
>> Column('added', DateTime, default=datetime.now()),
>> Column('modified', DateTime, default=datetime.now(),
>> onupdate=datetime.now()),
>> Column('scientific_name', String(200)),
>> Column('geographic_range', String(3)),
>> Column('trend', String(30)),
>> Column('nat_reproduction', Boolean),
>> Column('nat_dense_populations', Boolean),
>> Column('nat_dispersal_capacity', Boolean),
>> Column('nat_natural_habitats', Boolean),
>> Column('impact_global', Boolean),
>> Column('impact_competition', Boolean),
>> Column('impact_predation', Boolean),
>> Column('impact_hybridisation', Boolean),
>> Column('impact_disease_transmission', Boolean),
>> Column('impact_ecosystem_disruption', Boolean),
>> Column('impact_health', Boolean),
>> Column('impact_economic', Boolean),
>> Column('first_obs_belgium', Smallinteger),
>> Column('first_obs_flanders', Smallinteger),
>> Column('first_obs_wallonia', Smallinteger),
>> Column('intr_fishing', Boolean),
>> Column('intr_hunting', Boolean),
>> Column('intr_fur', Boolean),
>> Column('intr_culture', Boolean),
>> Column('intr_petornamental', Boolean),
>> Column('intr_canals', Boolean),
>> Column('intr_accidental', Boolean),
>> Column('intr_deliberated', Boolean),
>> Column('black_lists_belg', String(3)),
>> Column('black_lists_sebi', Boolean),
>> Column('black_lists_eppo', Boolean),
>> Column('status', Integer),
>> Column('group_id', Integer, ForeignKey('invasive_groups.id')),
>> Column('subgroup_id', Integer, ForeignKey('invasive_subgroups.id')))
>>
>> invasive_groups = Table('invasive_groups', meta,
>> Column('id', Integer, primary_key=True),
>> Column('group_name', String(100)))
>>
>> invasive_subgroups = Table('invasive_subgroups', meta,
>> Column('id', Integer, primary_key=True),
>> Column('subgroup_name', String(100)))
>>
>> invasive_names = Table('invasive_names', meta,
>> Column('name', String(200)),
>> Column('language_id', Integer, ForeignKey('languages.id'),
>> primary_key=True),
>> Column('invasive_id', Integer, ForeignKey('invasives.id'),
>> primary_key=True))
>> invasive_habitats = Table('invasive_habitats', meta,
>> Column('invasive_id', Integer, ForeignKey('invasives.id'),
>> primary_key=True),
>> Column('habitat_id', Integer, ForeignKey('habitats.id'),
>> primary_key=True))
>>
>> invasive_origins = Table('invasive_origins', meta,
>> Column('invasive_id', Integer, ForeignKey('invasives.id'),
>> primary_key=True),
>> Column('origin_id', Integer, ForeignKey('origins.id'),
>> primary_key=True))
>>
>> habitats = Table('habitats', meta,
>> Column('id', Integer, primary_key=True),
>> Column('habitat', String(100)))
>>
>> origins = Table('origins', meta,
>> Column('id', Integer, primary_key=True),
>> Column('origin', String(100)))
>>
>> mapper(Origin, origins)
>>
>> mapper(Habitat, habitats)
>>
>> mapper(InvasiveName, invasive_names)
>>
>> mapper(Invasive, invasives, properties = {
>> 'names' : relation(InvasiveName, backref='invasive', cascade='all,
>> delete-orphan'),
>> 'habitats' : relation(Habitat, secondary=invasive_habitats,
>> lazy=False),
>> 'origins' : relation(Origin, secondary=invasive_origins, lazy=False)
>> }
>> )
>>
>> mapper(InvasiveGroup, invasive_groups, properties = {
>> 'invasives' : relation(Invasive, backref='group', lazy=False)
>> }
>> )
>>
>> mapper(InvasiveSubGroup, invasive_subgroups, properties = {
>> 'invasives' : relation(Invasive, backref='subgroup', lazy=False)
>> }
>> )
>>
>> mapper(User, users)
>>
>> mapper(Language, languages, properties = {
>> 'invasive_names' : relation(InvasiveName, backref='language',
>> cascade='all, delete-orphan')
>> }
>> )
>>
>> mapper(UserPermission, user_permissions, properties = {
>> 'user' : relation(User,
>> backref=backref('permission', uselist=False), cascade='all,
>> delete-orphan', lazy=False)
>> }
>> )
>>
>> ###########################
>>
>> As you can see, I have a table "invasives" which is mapped to the
>> Invasive object. This table has a "many-to-many" relation with the
>> "habitats" table through the "invasive_habitats" table. So an invasive
>> can have multiple habitats. When I load an Invasive object from the
>> database with a session.query(Invasive).get(<pk>) I have their habitats
>> through the "habitats" properties ('habitats' : relation(Habitat,
>> secondary=invasive_habitats, lazy=False)), so this is OK and works fine.
>> The problem I have is when I want to update the habitats of an Invasive.
>> The values comes from an html <form> in a mod_python Session object
>> ("params" in the following). So I do something like :
>>
>> # application/controllers/invasive.py
>>
>> invasive_object = session.query(Invasive).get(168)
>>
>> => The result is send to the HTML form for update
>> => The user submit the modification
>>
>> Then I did the following :
>>
>> for habitat in self.params.getlist('invasive_habitats'):
>> invasive_object.habitats.append(query_habitat.get(habitat))
>>
>> which fails because SQLAlchemy does not update or delete the rows in the
>> "invasive_habitats" table. In place it try to insert a new record which
>> fail of course :
>>
>> INSERT INTO invasive_habitats (invasive_id, habitat_id) VALUES (168, 1)
>> 'INSERT INTO invasive_habitats (invasive_id, habitat_id) VALUES
>> (%(invasive_id)s, %(habitat_id)s)' [{'invasive_id': 168, 'habitat_id':
>> 1}, {'invasive_id': 168, 'habitat_id': 2}]
>>
>> I tried a clear() method like:
>>
>> invasive_object.habitats.clear()
>> for habitat in self.params.getlist('invasive_habitats'):
>> invasive_object.habitats.append(query_habitat.get(habitat))
>>
>> but it doesn't work ...
>> What did I wrong ?
>>
>> In advance, thanks !
>>
>> Julien
>>
>> --Julien Cigar
>> Belgian Biodiversity Platform
>> http://www.biodiversity.be
>> Université Libre de Bruxelles
>> Campus de la Plaine CP 257
>> Bâtiment NO, Bureau 4 N4 115C (Niveau 4)
>> Boulevard du Triomphe, entrée ULB 2
>> B-1050 Bruxelles
>> office: [EMAIL PROTECTED]
>> home: [EMAIL PROTECTED]
>>
>>
>>
>> _______________________________________________
>> Sqlalchemy-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users
>
_______________________________________________
Sqlalchemy-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users