Thank you, that works. Is there any way to later add or remove attributes, using the declarative system?
Cheers, Lars On Feb 8, 10:46 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > On Feb 8, 2011, at 3:52 PM, farcat wrote: > > > > > > > > > > > Hi everyone, > > > I am new to sqlalchemy and figuring out whether it is right for my > > project. What I am looking for is the ability to change classes and > > tables on the flight, with as much freedom as possible, potentially > > having metaclasses figuring out the difference between versions and > > updating the database accordingly. Additionally I would like to import > > databases and automatically generate class definitions. Some code I > > tried: > > > <code> > > from sqlalchemy import * > > from sqlalchemy.ext.declarative import declarative_base > > from sqlalchemy.orm import relation, sessionmaker > > > Base = declarative_base() > > > def Init(self, title=None, year=None): > > self.title = title > > self.year = year > > def Repr(self): > > return "Movie(%r, %r, %r)" % (self.title, self.year, > > self.director) > > > Movie = type("Movie", (Base,),{'__tablename__': "movies", > > "id":Column(Integer, primary_key=True), > > "title": Column(String(255), nullable=False), > > "year": Column(Integer), > > "directed_by": Column(Integer, > > ForeignKey('directors.id')), > > "director": relation("Director", backref='movies', > > lazy=False)}) > > setattr(Movie, "__init__", classmethod(Init)) > > setattr(Movie, "__repr__", classmethod(Repr)) > > > class Director(Base): > > __tablename__ = 'directors' > > > id = Column(Integer, primary_key=True) > > name = Column(String(50), nullable=False, unique=True) > > > def __init__(self, name=None): > > self.name = name > > > def __repr__(self): > > return "Director(%r)" % (self.name) > > > engine = create_engine('sqlite:///meta.db', echo=True) > > Base.metadata.create_all(engine) > > > if __name__ == "__main__": > > Session = sessionmaker(bind=engine) > > session = Session() > > > m1 = Movie("Star Trek", 2009) > > m1.director = Director("JJ Abrams") > > > d2 = Director("George Lucas") > > d2.movies = [Movie("Star Wars", 1977), Movie("THX 1138", 1971)] > > > try: > > session.add(m1) > > session.add(d2) > > session.commit() > > except: > > session.rollback() > > > alldata = session.query(Movie).all() > > for somedata in alldata: > > print somedata > > > <\code> > > > with as error: > > > 2011-02-08 21:50:47,553 INFO sqlalchemy.engine.base.Engine.0x...ef0L > > PRAGMA table_info("directors") > > 2011-02-08 21:50:47,553 INFO sqlalchemy.engine.base.Engine.0x...ef0L > > () > > Traceback (most recent call last): > > File "D:\Documents\Code\NetBeans\test\alchemy\src\alchemy.py", line > > 49, in <module> > > m1.director = Director("JJ Abrams") > > File "C:\Python27\lib\site-packages\sqlalchemy\orm\attributes.py", > > line 158, in __set__ > > 2011-02-08 21:50:47,555 INFO sqlalchemy.engine.base.Engine.0x...ef0L > > PRAGMA table_info("movies") > > 2011-02-08 21:50:47,555 INFO sqlalchemy.engine.base.Engine.0x...ef0L > > () > > self.impl.set(instance_state(instance), > > AttributeError: 'Movie' object has no attribute '_sa_instance_state' > > > Can anyone shed some light or explain the error message? > > your __init__ monkeypatch is interfering with SQLA's wrapping of this method. > > Try > > Movie = type("Movie", (Base,),{'__tablename__': "movies", > "__init__":Init, > "id":Column(Integer, primary_key=True), > "title": Column(String(255), nullable=False), > "year": Column(Integer), > "directed_by": Column(Integer,ForeignKey('directors.id')), > "director": relation("Director", > backref='movies',lazy=False)}) > > instead. > > > > > > > > > > > -- > > 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 > > athttp://groups.google.com/group/sqlalchemy?hl=en. -- 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.