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