Hi all,

I'm using Elixir & SQLAlchemy to run a routing Application.
The App will store people their trips and their corresponding
trip_stops.

I ran into a strange problem with the ordering_list.
I included the source of the Person table to be complete.

If I run this code:

oli = model.Person(login='oberger', email = 'my_mal',
password='secrt', last_name='Berger', first_name = 'Oliver')
short_trip = model.Trip(description='short trip')
oli.trips.append(short_trip)

ts = model.Trip_Stop(adress='Town1')
ts2 = model.Trip_Stop(adress='Town2')
ts3 = model.Trip_Stop(adress='Town3')
ts4 = model.Trip_Stop(adress='Town4')

short_trip.trip_stops.append(ts)
short_trip.trip_stops.append(ts2)
short_trip.trip_stops.append(ts3)
short_trip.trip_stops.insert(2, ts4)
model.Session.commit()

del short_trip.trip_stops[1]
model.Session.commit()

I'll get this error from the oracle database:
"
IntegrityError: (IntegrityError) ORA-00001: Unique Constraint
(TRAV_OWNER.SYS_C007296) verletzt
 'UPDATE trip_stop SET waypoint_nr=:waypoint_nr WHERE
trip_stop.trip_sid = :trip_stop_trip_sid AND
 = :trip_stop_waypoint_nr' {'trip_stop_waypoint_nr': 2, 'waypoint_nr':
1, 'trip_stop_trip_sid': 1}
"

I am an oracle guy and know this database very well.
It seems that SQLAlchemy is updating the rows in table trip_stop in
the wrong order, so that a
UNIQUE KEY violation occours. If the updates are sent in the correct
order, no Error wil occour.
I think this is a bug.

Here is my model:
If anyone can help me, Thanks a lot

Oliver




class Person(Entity):
    sid                       = Field(Integer, Sequence('PERSON_SEQ'),
primary_key=True)
    email                     = Field(String(60), required=True)
    login                     = Field(String(20), required=True)
    password                  = Field(String(100) )
    last_name                 = Field(String(50))
    first_name                = Field(String(40))
    gender                    = Field(Boolean)
    is_smoker                 = Field(Boolean)
    zip_code                  = Field(String(20))
    city                      = Field(String(80))
    last_login                = Field(DateTime, PassiveDefault(text
('sysdate')), required=True)
    date_updated              = Field(DateTime, PassiveDefault(text
("sysdate")), required=True)
    date_created              = Field(DateTime, PassiveDefault(text
("sysdate")), required=True)
    locked_flag               = Field(Boolean, PassiveDefault('0'),
required=True)
    verified                  = Field(Boolean, PassiveDefault('0'),
required=True)
    trips                     = OneToMany('Trip')

    def __repr__(self):
        return '<%r %r, email: %r, last_name: %s, first_name: %s>' \
               % (self.__class__.__name__.capitalize(), self.login,
self.email, self.last_name, self.first_name)

    @events.before_insert
    @events.before_update
    def encrypt_password(self):
        if self.password:
            self.password = encrypt_value(self.password)
            self.password_check = self.password



from sqlalchemy.ext.orderinglist import ordering_list
class Trip(Entity):
    sid                       = Field(Integer, Sequence('TRIP_SEQ'),
primary_key=True)
    person                    = ManyToOne('Person',colname =
'person_sid', ondelete='cascade' , required=True)
    description               = Field(String(200), required=True)
    seat_count                = Field(Integer, PassiveDefault('1'),
required=True)
    smoking_allowed           = Field(Boolean, PassiveDefault('0'),
required=True)
    passenger_gender          = Field(String(1), PassiveDefault('A'),
required=True)
    expired                   = Field(Boolean, PassiveDefault('0'),
required=True)
    date_updated              = Field(DateTime, PassiveDefault(text
("SYSDATE")), required=True)
    date_created              = Field(DateTime, PassiveDefault(text
("sysdate")), required=True)
    type                      = Field(String(1), PassiveDefault('S'),
required=True)
    valid_from                = Field(DateTime)
    trip_stops                = OneToMany('Trip_Stop',
collection_class=ordering_list('waypoint_nr'),
                                          order_by='waypoint_nr',
cascade="all, delete, delete-orphan")

    def __repr__(self):
        return '<%r %r, desc: %r>' \
               % (self.__class__.__name__.capitalize(), self.sid,
self.description)


from sqlalchemy.ext.orderinglist import ordering_list


class Trip_Stop(Entity):
    trip                      = ManyToOne('Trip',colname = 'trip_sid',
ondelete='cascade', primary_key=True)
    waypoint_nr               = Field(Integer, primary_key=True)
    adress                    = Field(String(200), required=True)
    geo_x                     = Field(Float, default=0, required=True)
    geo_y                     = Field(Float, default=0, required=True)
    duration_in_minutes       = Field(Integer, default=7,
required=True)
    price_in_euro             = Field(Numeric(precision=22, scale=2,
asdecimal=True), PassiveDefault(text("0")), required=True)

    def __repr__(self):
        return '<%r %r, desc: %r>' \
               % (self.__class__.__name__.capitalize(),
self.waypoint_nr, self.adress)


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to