I have an intermediate model which I am using to keep track of which labs 
to include since individual labs can be removed.
So when you add a new intermediate model (AgendaModel) it automatically 
adds all of the labs.
with 

@event.listens_for(Agenda.modules, 'append')

But there is a UNIQUE constraint violation.

I'm using Flask and Flask-SQLAlchemy
and 
psql (PostgreSQL) 9.3.4




Traceback (most recent call last):
  File "db.py", line 102, in <module>
    db.session.commit()
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py",
 line 149, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 768, in commit
    self.transaction.commit()
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 370, in commit
    self._prepare_impl()
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 350, in _prepare_impl
    self.session.flush()
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 1907, in flush
    self._flush(objects)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 2025, in _flush
    transaction.rollback(_capture_exception=True)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py",
 line 57, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 line 1989, in _flush
    flush_context.execute()
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py",
 line 371, in execute
    rec.execute(self)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py",
 line 480, in execute
    self.dependency_processor.process_saves(uow, states)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/dependency.py",
 line 1087, in process_saves
    secondary_update, secondary_delete)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/dependency.py",
 line 1130, in _run_crud
    connection.execute(statement, secondary_insert)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
 line 727, in execute
    return meth(self, multiparams, params)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py",
 line 322, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
 line 824, in _execute_clauseelement
    compiled_sql, distilled_params
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
 line 954, in _execute_context
    context)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
 line 1116, in _handle_dbapi_exception
    exc_info
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py",
 line 189, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
 line 924, in _execute_context
    context)
  File 
"/home/siecje/Desktop/db/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py",
 line 432, in do_executemany
    cursor.executemany(statement, parameters)sqlalchemy.exc.IntegrityError: 
(IntegrityError) UNIQUE constraint failed: agenda_labs.lab_id, 
agenda_labs.agenda_id, agenda_labs.module_id u'INSERT INTO agenda_labs (lab_id, 
agenda_id, module_id) VALUES (?, ?, ?)' ((1, 1, 1), (1, 1, 1))



from flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 
'sqlite:///test.db'db = SQLAlchemy(app)
from sqlalchemy import funcfrom sqlalchemy.ext.orderinglist import ordering_list

# Many-To-Many tablesmodule_labs = db.Table('module_labs',
    db.Column('lab_id', db.Integer, db.ForeignKey('labs.id'), primary_key=True),
    db.Column('module_id', db.Integer, db.ForeignKey('modules.id'), 
primary_key=True))
agenda_labs = db.Table('agenda_labs',
    db.Column('lab_id', db.Integer, db.ForeignKey('labs.id'), primary_key=True),
    db.Column('agenda_id', db.Integer, primary_key=True),
    db.Column('module_id', db.Integer, primary_key=True),
    db.ForeignKeyConstraint(['agenda_id', 'module_id'], 
['agenda_modules.agenda_id', 'agenda_modules.module_id']))

class AgendaModule(db.Model):
    __tablename__ = 'agenda_modules'
    module_id = db.Column(db.Integer, db.ForeignKey('modules.id'), 
primary_key=True)
    agenda_id = db.Column(db.Integer, db.ForeignKey('agendas.id'), 
primary_key=True)
    module_position = db.Column(db.Integer)
    module = db.relationship('Module', backref='agendas')

    # Used to remove individual labs from a module
    labs = db.relationship('Lab', secondary=agenda_labs, 
backref=db.backref('agendas', lazy='dynamic'))

    def __unicode__(self):
        return self.module.name
class Lab(db.Model):
    __tablename__ = 'labs'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text, nullable=False)

    def __repr__(self):
        return '<Lab %r>' % self.name

class Module(db.Model):
    __tablename__ = 'modules'

    id = db.Column(db.Integer, primary_key=True)
    location = db.Column(db.Text, unique=True)
    name = db.Column(db.Text, nullable=False)

    labs = db.relationship('Lab', secondary=module_labs, 
backref=db.backref('modules', lazy='dynamic'))

    def __repr__(self):
        return '<Module %r>' % self.name

class Agenda(db.Model):
    __tablename__ = 'agendas'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)

    modules = db.relationship('AgendaModule', backref='agenda', 
order_by=AgendaModule.module_position,
                              collection_class=ordering_list('module_position'))

    def __repr__(self):
        return '<Agenda %r>' % self.name

# Automatically deal with adding modules to Agendas and Bundlesfrom sqlalchemy 
import event

@event.listens_for(Agenda.modules, 'append')def include_all(agenda, 
agenda_module, initiator):
    """ Include all Labs, Lectures, Videos when a module is added. """
    for lab in agenda_module.module.labs or []:
        agenda_module.labs.append(lab)
    return agenda_module

if __name__ == '__main__':
    db.create_all()
    # Create agenda with modules with labs, lectures, videos
    agenda = Agenda(name='Agenda to be Deleted')

    module = Module(name='Module for Labs')
    lab1 = Lab(name='Lab')
    module.labs.append(lab1)

    am = AgendaModule()
    am.module = module
    am.agenda = agenda
    agenda.modules.append(am)

    db.session.add(agenda)
    db.session.commit()



-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to