Query bug when not using ec.saveChanges

Ernesto Revilla <[email protected]> Tue, 10 Aug 2004 18:30:15 +0200
Newsgroups gmane.comp.python.modeling
Message-ID <[email protected]>
Dear all,

just a question: can't I fetch objects by attribute access, without 
having used ec.saveChanges first? See the last 4 lines of the following 
source code. What restrictions exist using fetch, in respect with 
ec.saveChanges?

Thanx,
Erny


"""
A simple model
+-------+    1          0,*   +--------+   1         0,*          +-------------+
| Hotel |<-hotel------rooms->>| Room   |<-room-----reservations->>| Reservation |
+-------+  nullify    cascade +--------+  nullify   cascade       +-------------+
| name  |                     | number |                          | startDay    |
+-------+                     +--------+                          | endDay      |
                                                                  +-------------+
"""

from Modeling.PyModel import *

# valores por defecto para el modelo
Attribute.defaults['usedForLocking']=1
AString.defaults['externalType']='TEXT'
AString.defaults['width'] = 0
AString.defaults['usedForLocking']=1

Association.defaults['delete']=['nullify', 'nullify']

Entity.defaults['properties'] = [
  APrimaryKey('id', isClassProperty=0, isRequired=1, doc='PK')
]

_connDict = {'database': 'reservations.sqlite'}
model = Model('Reservations',adaptorName='SQLite', connDict=_connDict, version='0.1')
model.doc=__doc__

model.entities = [
  Entity('Hotel',
         properties=[ AString('name', isRequired=1),
                    ],
         ),

  Entity('Room',
         properties=[ AInteger('number', isRequired=1),
                      ]
         ),

  Entity('Reservation',
         properties=[ 
                      ADateTime('startDay', isRequired=1),
                      ADateTime('endDay', isRequired=1),
                      ]
         ),
]

# Associations will allways be defined towards the 'one' part.
model.associations = [
    Association('Reservation', 'Room', relations=['room','reservations'],
                multiplicity=[ [1, 1] , [0, None] ],
                delete=['nullify','cascade']),
    Association('Room', 'Hotel', relations=['hotel','rooms'],
                multiplicity=[ [1, 1] , [0, None] ],
                delete=['nullify','deny']),
]

model.build()


def test():
    from Modeling.EditingContext import EditingContext
    from mx.DateTime import Date, Time
    from Reservations.Hotel import Hotel
    from Reservations.Room import Room
    from Reservations.Reservation import Reservation
    ec=EditingContext()
    h=ec.fetch('Hotel','name == "Ritz"') #!!! tiene q ser "Ritz" no 'Ritz'
    if not h:
        h=Hotel(name="Ritz"); ec.insert(h)
        ec.saveChanges()
    else:
        h=h[0]
    r=ec.fetch('Room','number == 101')
    if not r:
        r=Room(number=101); ec.insert(r)
        r.setHotel(h)
        ec.saveChanges()
    else:
        r=r[0]
    
    res=Reservation()
    ec.insert(res)
    res.setRoom(r); r.addToReservations(res)
    res.setStartDay(Date(2004,8,9)); res.setEndDay(Date(2004,8,14))

    # ec.saveChanges()	

    ## This does return an instance in each case
    res=ec.fetch("Reservation",'startDay like "2004-08-09*"')
    print "res normal fetch:",res
    

    ## !!! without ec.saveChanges this does return None !!!
    res=ec.fetch("Room",'reservations.startDay like "2004-08-09*"')
    print "res fetch with attribute traversal:",res




---
avast! Antivirus: Saliente mensaje limpio.
Base de datos de Virus (VPS): 0433-1, 09/08/2004
Comprobado en: 10/08/2004 18:30:15
avast! tiene los derechos reservados (c) 2000-2004 ALWIL Software.
http://www.avast.com





-------------------------------------------------------
SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media
100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33
Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift.
http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285