Thanks for your answer, I tried your proposition and made the following
changes to the code:
The setters come from my PHP background ... some habits are difficult to
abandon ;-)
# new car class
class Car(object):
def __init__(self, name):
self.name = name
self.brand = None
self.brand_id = None
# brand assignement
# some Audis
a4 = Car('A4 quattro')
a4.brand = audi
a6 = Car('A6')
a6.brand = audi
# a BMW
i326 = Car('i326')
i326.brand = bmw
If you want I can make a better commented version of the code and make it
available to the wiki. I don't know if I can make new entries in the wiki
myself, but I can prepare the example and send it to a wiki author.
On Wednesday 01 April 2009 16:47:48 Michael Bayer wrote:
> its almost an example fit for a tutorial. I'd just lose the "setBrand()"
> method and just assign car.brand = somebrand. the "brand_id" gets
> populated by the ORM when things are flushed.
>
> Frank Broniewski wrote:
> > Hi all,
> >
> > I want to know if I am using SQLAlchemy in a correct and proper way for
> > Many
> > to One Relations between objects and database tables. I have created a
> > test
> > case for Cars and Brands. Each car can have a name and one Brand. I
> > wonder if
> > I use the setter in the Car Class correctly and if the assignement in the
> > car
> > mapper is correct also.
> > Just to be clear, it is working, but I want to know if I use everything
> > correctly here.
> >
> > Many thanks for your comments
> >
> > Frank
> >
> > CODE:
> >
> > #!/usr/bin/python
> > # coding: utf-8
> > from sqlalchemy import create_engine, Table, Column, Integer, String,
> > MetaData, ForeignKey
> > from sqlalchemy.orm import mapper, sessionmaker, relation, backref
> > engine = create_engine('sqlite:///:memory:', echo=True)
> >
> > class Car(object):
> > def __init__(self, name):
> > self.name = name
> > self.brand = None
> > self.brand_id = None
> >
> > def setBrand(self, brand):
> > self.brand_id = brand.id
> > self.brand = brand
> >
> > class Brand(object):
> > def __init__(self, name):
> > self.name = name
> >
> >
> > metadata = MetaData()
> >
> > brands = Table('brands', metadata
> > ,Column('id', Integer, primary_key=True)
> > ,Column('name', String(10),
> > nullable=False))
> >
> > cars = Table('cars', metadata
> > ,Column('id', Integer, primary_key=True)
> > ,Column('name', String(10),
> > nullable=False)
> > ,Column('brand_id', Integer,
> > ForeignKey('brands.id')))
> >
> > metadata.create_all(engine)
> >
> > mapper(Car, cars, properties={'brand': relation(Brand)})
> > mapper(Brand, brands)
> >
> > Session = sessionmaker(bind=engine, autoflush=True)
> > ps = Session()
> >
> > porsche = Brand('Porsche')
> > bmw = Brand('BMW')
> > audi = Brand('Audi')
> >
> > # some Audis
> > a4 = Car('A4 quattro')
> > a4.setBrand(audi)
> > a6 = Car('A6')
> > a6.setBrand(audi)
> > # a BMW
> > i326 = Car('i326')
> > i326.setBrand(bmw)
> >
> > ps.add(a4)
> > ps.add(a6)
> > ps.add(i326)
> >
> > res = ps.query(Car)
> >
> > for a_car in res:
> > print a_car.brand.name
> > --
> > Frank Broniewski
> >
> > Metrico s.àr.l. ( http://www.metrico.lu )
> > 36, rue des Romains
> > L-5433 Niederdonven
> > Luxembourg
> >
> > Fon: +352 26 74 94 28
> > Fax: +352 26 74 94 99
>
>
--
Frank Broniewski
Metrico s.àr.l. ( http://www.metrico.lu )
36, rue des Romains
L-5433 Niederdonven
Luxembourg
Fon: +352 26 74 94 28
Fax: +352 26 74 94 99
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---