SQLAlchemy __init__ not working

I have the following code:

session = scoped_session(sessionmaker(autocommit=False, autoflush=True, bind=engine)) Base = declarative_base() Base.query = session.query_property() class CommonBase(object): created_at = Column(DateTime, default=datetime.datetime.now) updated_at = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now) class Look(Base, CommonBase): __tablename__ = "looks" id = Column(Integer, primary_key=True) def __init__(self): print "__init__ is run" Base.__init__(self) self.feedback = None def set_feedback(self, feedback): """Status can either be 1 for liked, 0 no response, or -1 disliked. """ assert feedback in [1, 0, -1] self.feedback = feedback def get_feedback(self): return self.feedback 

And I get the following error:

 Traceback (most recent call last): File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__ return self.wsgi_app(environ, start_response) File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request rv = self.dispatch_request() File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/backend.py", line 94, in wrapped ret = f(*args, **kwargs) File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/backend.py", line 81, in decorated return f(*args, **kwargs) File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/backend.py", line 187, in next json_ret = ge.encode(results) # automatically pulls the tags File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode chunks = self.iterencode(o, _one_shot=True) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode return _iterencode(o, 0) File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/__init__.py", line 54, in default jsonable = self.convert_to_jsonable(obj) File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/__init__.py", line 40, in convert_to_jsonable image_url=obj.image_url, feedback=obj.get_feedback()) File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/models.py", line 100, in get_feedback return self.feedback AttributeError: 'Look' object has no attribute 'feedback' 

It seems to me that my __init__ method does not start, since I do not see any print statements in my log.

Can someone explain why my __init__ not running and what can I do for this?

+8
python sqlalchemy
source share
1 answer

Check out the SQLAlchemy reconstruction documentation :

SQLAlchemy ORM does not call __init__ when recreating objects from a database row. The ORM process is somewhat similar to the Python standard pickle library module, calling the low level __new__ method, and then quietly restoring attributes directly on the instance instead of calling __init__ .

If you need to do some customization on instances downloaded from the database before theyre ready for use, you can use the @reconstructor decorator for the tag method as an ORM counterpart to __init__ . SQLAlchemy will call this method with no arguments each time it loads or restores one of your instances. This is useful for recreating the transient properties that are usually assigned in __init__ :

 from sqlalchemy import orm class MyMappedClass(object): def __init__(self, data): self.data = data # we need stuff on all instances, but not in the database. self.stuff = [] @orm.reconstructor def init_on_load(self): self.stuff = [] 

When obj = MyMappedClass () is executed, Python calls __init__ as usual, and the data argument. When instances are loaded during a request operation, as in the request (MyMappedClass) .one (), init_on_load .

+25
source share

All Articles