# test_event.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, ForeignKey
from sqlalchemy import Integer, UnicodeText
from sqlalchemy import event

from sqlalchemy.orm import relationship

engine = 
create_engine('postgresql+psycopg2://USER:PASSWORD@127.0.0.1:5432/test', 
echo=True)

Session = sessionmaker()
Base = declarative_base()

Session.configure(bind=engine)
Base.metadata.bind = engine

class Comment(Base):
    __tablename__ = 'comment'
   
    id = Column(Integer, primary_key=True)
    content = Column(UnicodeText, nullable=False)
    report_id = Column(Integer, ForeignKey('report.id'), nullable=False)

def comment_after_insert_listener(mapper, connection, target):
    target.report.comments_count += 1

event.listen(Comment, 'after_insert', comment_after_insert_listener)

class Report(Base):
    __tablename__ = 'report'
   
    id = Column(Integer, primary_key=True)
    content = Column(UnicodeText, nullable=False)
    comments_count = Column(Integer, server_default='0', nullable=False)
   
    comments = relationship('Comment', backref='report', cascade='all, 
delete-orphan', order_by='Comment.id')

Base.metadata.create_all(engine)

session = Session()

report = Report(content=u'test report')
session.add(report)
session.flush()
session.commit()

comment = Comment(content=u'test comment', report_id=1)
session.add(comment)
session.flush()
session.commit()                                                           
                                                                  


% /home/eps/tourclub/bin/python test_event.py
2011-11-09 10:19:38,970 INFO sqlalchemy.engine.base.Engine select version()
2011-11-09 10:19:38,970 INFO sqlalchemy.engine.base.Engine {}
2011-11-09 10:19:38,972 INFO sqlalchemy.engine.base.Engine select 
current_schema()
2011-11-09 10:19:38,972 INFO sqlalchemy.engine.base.Engine {}
2011-11-09 10:19:38,974 INFO sqlalchemy.engine.base.Engine select relname 
from pg_class c join pg_namespace n on n.oid=c.relnamespace where 
n.nspname=current_schema() and relname=%(name)s
2011-11-09 10:19:38,974 INFO sqlalchemy.engine.base.Engine {'name': 
u'report'}
2011-11-09 10:19:38,976 INFO sqlalchemy.engine.base.Engine select relname 
from pg_class c join pg_namespace n on n.oid=c.relnamespace where 
n.nspname=current_schema() and relname=%(name)s
2011-11-09 10:19:38,976 INFO sqlalchemy.engine.base.Engine {'name': 
u'comment'}
2011-11-09 10:19:38,978 INFO sqlalchemy.engine.base.Engine
CREATE TABLE report (
        id SERIAL NOT NULL,
        content TEXT NOT NULL,
        comments_count INTEGER DEFAULT '0' NOT NULL,
        PRIMARY KEY (id)
) 
  
  
2011-11-09 10:19:38,978 INFO sqlalchemy.engine.base.Engine {}
2011-11-09 10:19:39,041 INFO sqlalchemy.engine.base.Engine COMMIT
2011-11-09 10:19:39,051 INFO sqlalchemy.engine.base.Engine
CREATE TABLE comment (
        id SERIAL NOT NULL,
        content TEXT NOT NULL,
        report_id INTEGER NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY(report_id) REFERENCES report (id)
) 
  
  
2011-11-09 10:19:39,051 INFO sqlalchemy.engine.base.Engine {}
2011-11-09 10:19:39,134 INFO sqlalchemy.engine.base.Engine COMMIT
2011-11-09 10:19:39,145 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-11-09 10:19:39,146 INFO sqlalchemy.engine.base.Engine INSERT INTO 
report (content) VALUES (%(content)s) RETURNING report.id
2011-11-09 10:19:39,146 INFO sqlalchemy.engine.base.Engine {'content': 
u'test report'}
2011-11-09 10:19:39,147 INFO sqlalchemy.engine.base.Engine COMMIT
2011-11-09 10:19:39,151 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2011-11-09 10:19:39,152 INFO sqlalchemy.engine.base.Engine INSERT INTO 
comment (content, report_id) VALUES (%(content)s, %(report_id)s) RETURNING 
comment.id
2011-11-09 10:19:39,152 INFO sqlalchemy.engine.base.Engine {'content': 
u'test comment', 'report_id': 1}
2011-11-09 10:19:39,154 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
  File "test_event.py", line 54, in <module>
    session.flush()
  File "/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/orm/session.py", 
line 1547, in flush
    self._flush(objects)
  File "/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/orm/session.py", 
line 1616, in _flush
    flush_context.execute()
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py", 
line 328, in execute
    rec.execute(self)
  File 
"/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py", 
line 472, in execute
    uow
  File "/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/orm/mapper.py", 
line 2270, in _save_obj
    mapper.dispatch.after_insert(mapper, connection, state)
  File "/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/event.py", line 
274, in __call__
    fn(*args, **kw)
  File "/home/eps/devel/tourclub/sqlalchemy/lib/sqlalchemy/orm/events.py", 
line 360, in wrap
    wrapped_fn(*arg, **kw)
  File "test_event.py", line 29, in comment_after_insert_listener
    target.report.comments_count += 1
AttributeError: 'NoneType' object has no attribute 'comments_count'

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/NW3I6hlCyPMJ.
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