On Feb 9, 2011, at 1:52 AM, farcat wrote: > Thank you, that works. > > Is there any way to later add or remove attributes, using the > declarative system?
add yes, just plug them on, http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#defining-attributes, removal not so much since the mapper has internal state corresponding to each attribute. Usually object oriented application models don't change constantly as the application runs. > > 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. > -- 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.