Ernesto Revilla
2004-08-10 14:32:03 UTC
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
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