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.

Reply via email to