When I change the engine from sqlite (which works as intended) to MySQL,
I come up with this error:
Traceback (most recent call last):
File "./test.py", line 182, in ?
session.flush()
File "build/bdist.linux-i686/egg/sqlalchemy/orm/session.py", line 233,
in flush
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
240, in flush
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
407, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
687, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
648, in _execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
687, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
648, in _execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
687, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
648, in _execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
687, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
648, in _execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
687, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
648, in _execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
687, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
648, in _execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
682, in execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
634, in _save_objects
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
634, in _save_objects
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line
632, in _save_objects
File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 654,
in save_obj
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 240,
in execute
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 264,
in execute_clauseelement
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 280,
in execute_compiled
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 276,
in proxy
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 315,
in _execute_raw
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 334,
in _execute
sqlalchemy.exceptions.SQLError: (IntegrityError) (1062, "Duplicate entry
'0' for key 1") 'INSERT INTO magazine_page (magazine_id, orders) VALUES
(%s, %s)' [1L, '']
I have attached a copy of the output.
Cheers,
Nick
Michael Bayer wrote:
> hey Nick -
>
> these are terrific tests, sorry i didnt have this all working ahead of
> time but this is how this stuff has ended up getting done in a lot of
> cases...
>
> made a few tweaks to polymorphic loading in changeset 1555. a few
> changes to your script, which is attached. the "default='0'" on all
> your ID columns was confusing it in many cases, so i took those out (if
> you really need those there, we can look into making them less confusing
> to the mapper). secondly, since you are making a relationship directly
> to the MagazinePage mapper which you want to be polymorphic towards the
> ClassifiedPage mapper, that mapper needs its own polymorphic selectable
> (and i am blown away that this works at all...i hadnt taken it this far):
>
> page_join = polymorphic_union(
> {
> 'm': page_table.join(magazine_page_table),
> 'c':
> page_table.join(magazine_page_table).join(classified_page_table),
> 'p': page_table.select(page_table.c.type=='p'),
> }, None, 'page_join')
>
> magazine_join = polymorphic_union(
> {
> 'm': page_table.join(magazine_page_table),
> 'c':
> page_table.join(magazine_page_table).join(classified_page_table),
> }, None, 'page_join')
>
> page_mapper = mapper(Page, page_table, select_table=page_join,
> polymorphic_on=page_join.c.type, polymorphic_identity='p')
>
> magazine_page_mapper = mapper(MagazinePage, magazine_page_table,
> select_table=magazine_join, inherits=page_mapper,
> polymorphic_identity='m', properties={
> 'magazine': relation(Magazine, backref=backref('pages'))
> })
>
> classified_page_mapper = mapper(ClassifiedPage, classified_page_table,
> inherits=magazine_page_mapper, polymorphic_identity='c')
>
> so the attached file does that and also retrieves two ClassifiedPage and
> one MagazinePage off the relationship.
>
> Would there be any issue if I converted these scripts into further unit
> tests to be included with the SA distribution ? youve come across some
> patterns that have not been done before and these are very useful.
>
>
>
> ------------------------------------------------------------------------
>
> import sqlalchemy.mods.threadlocal
> from sqlalchemy import *
>
> # set-up tables
>
> metadata = BoundMetaData('sqlite://:memory:')
> #metadata = BoundMetaData('postgres://scott:[EMAIL PROTECTED]/test')
>
> zerodefault = {} #{'default':0}
> publication_table = Table('publication', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('name', String(45), default=''),
> )
> issue_table = Table('issue', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('publication_id', Integer, ForeignKey('publication.id'),
> **zerodefault),
> Column('issue', Integer, **zerodefault),
> )
> location_table = Table('location', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('issue_id', Integer, ForeignKey('issue.id'), **zerodefault),
> Column('ref', CHAR(3), default=''),
> Column('location_name_id', Integer, ForeignKey('location_name.id'),
> **zerodefault),
> )
> location_name_table = Table('location_name', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('name', String(45), default=''),
> )
> magazine_table = Table('magazine', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('location_id', Integer, ForeignKey('location.id'), **zerodefault),
> Column('page_size_id', Integer, ForeignKey('page_size.id'),
> **zerodefault),
> )
> page_table = Table('page', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('page_no', Integer, **zerodefault),
> Column('type', CHAR(1), default='p'),
> )
> magazine_page_table = Table('magazine_page', metadata,
> Column('page_id', Integer, ForeignKey('page.id'), primary_key=True,
> **zerodefault),
> Column('magazine_id', Integer, ForeignKey('magazine.id'), **zerodefault),
> Column('orders', TEXT, default=''),
> )
> classified_page_table = Table('classified_page', metadata,
> Column('magazine_page_id', Integer, ForeignKey('magazine_page.page_id'),
> primary_key=True, **zerodefault),
> Column('titles', String(45), default=''),
> )
> page_size_table = Table('page_size', metadata,
> Column('id', Integer, primary_key=True, default=None),
> Column('width', Integer, **zerodefault),
> Column('height', Integer, **zerodefault),
> Column('name', String(45), default=''),
> )
>
> # set-up mappers
>
> class BaseObject(object):
> def __init__(self, *args, **kwargs):
> for key, value in kwargs.iteritems():
> setattr(self, key, value)
> def __repr__(self):
> return "%s(%s)" % (self.__class__.__name__, ",".join("%s=%s" % (key,
> repr(value)) for key,value in self.__dict__.iteritems() if key[0] != '_' and
> value))
>
> class Publication(BaseObject):
> pass
>
> class Issue(BaseObject):
> pass
>
> class Location(BaseObject):
> def _get_name(self):
> return self._name
>
> def _set_name(self, name):
> session = objectstore.get_session()
> s =
> session.query(LocationName).selectfirst(location_name_table.c.name==name)
>
> if s is not None:
> self._name = s
>
> return
>
> found = False
>
> for i in session.new:
> if isinstance(i, LocationName) and i.name == name:
> self._name = i
> found = True
>
> break
>
> if found == False:
> self._name = LocationName(name=name)
>
> name = property(_get_name, _set_name)
>
> class LocationName(BaseObject):
> pass
>
> class PageSize(BaseObject):
> pass
>
> class Magazine(BaseObject):
> pass
>
> class Page(BaseObject):
> pass
>
> class MagazinePage(Page):
> pass
>
> class ClassifiedPage(MagazinePage):
> pass
>
> publication_mapper = mapper(Publication, publication_table)
>
> issue_mapper = mapper(Issue, issue_table, properties = {
> 'publication': relation(Publication, backref=backref('issues',
> cascade="add, delete-orphan")),
> })
>
> location_name_mapper = mapper(LocationName, location_name_table)
>
> location_mapper = mapper(Location, location_table, properties = {
> 'issue': relation(Issue, backref='locations'),
> '_name': relation(LocationName),
> })
>
> issue_mapper.add_property('locations', relation(Location, lazy=False,
> private=True, backref='issue'))
>
> page_size_mapper = mapper(PageSize, page_size_table)
>
> page_join = polymorphic_union(
> {
> 'm': page_table.join(magazine_page_table),
> 'c': page_table.join(magazine_page_table).join(classified_page_table),
> 'p': page_table.select(page_table.c.type=='p'),
> }, None, 'page_join')
>
> magazine_join = polymorphic_union(
> {
> 'm': page_table.join(magazine_page_table),
> 'c': page_table.join(magazine_page_table).join(classified_page_table),
> }, None, 'page_join')
>
> magazine_mapper = mapper(Magazine, magazine_table, properties = {
> 'location': relation(Location, backref=backref('magazine',
> uselist=False)),
> 'size': relation(PageSize),
> })
>
> page_mapper = mapper(Page, page_table, select_table=page_join,
> polymorphic_on=page_join.c.type, polymorphic_identity='p')
>
> magazine_page_mapper = mapper(MagazinePage, magazine_page_table,
> select_table=magazine_join, inherits=page_mapper, polymorphic_identity='m',
> properties={
> 'magazine': relation(Magazine, backref=backref('pages'))
> })
>
> #magazine_mapper.add_property('pages', relation(MagazinePage, lazy=True,
> private=True))
>
> classified_page_mapper = mapper(ClassifiedPage, classified_page_table,
> inherits=magazine_page_mapper, polymorphic_identity='c')
>
> session = objectstore.get_session()
>
> # do some operations
>
> metadata.engine.echo = "debug"
>
> metadata.drop_all()
> metadata.create_all()
>
> pub = Publication(name='Test')
> issue = Issue(issue=46,publication=pub)
>
> location = Location(ref='ABC',name='London',issue=issue)
>
> page_size = PageSize(name='A4',width=210,height=297)
>
> magazine = Magazine(location=location,size=page_size)
> page = ClassifiedPage(magazine=magazine,page_no=1)
> page2 = MagazinePage(magazine=magazine,page_no=2)
> page3 = ClassifiedPage(magazine=magazine,page_no=3)
>
> session.flush()
> session.clear()
>
> session.echo_uow=True
> session.flush()
> session.clear()
> p = session.query(Publication).selectone_by(name='Test')
>
> print p.issues[0].locations[0].magazine.pages
>
> #metadata.drop_all()
>
>
> ------------------------------------------------------------------------
>
>
>
> On May 30, 2006, at 4:48 PM, Nick Joyce wrote:
>
>> I have now moved on a bit and came up against a brick wall :/
>>
>> I have a ClassifiedPage instance which inherits from MagazinePage which
>> in-turn inherits from Page.
>>
>> Log:
>>
>> [2006-05-30 21:43:25,602] [engine]: INSERT INTO page (page_no, type)
>> VALUES (?, ?)
>> [2006-05-30 21:43:25,602] [engine]: [1, 'c']
>> [2006-05-30 21:43:25,603] [engine]: INSERT INTO magazine_page (page_id,
>> magazine_id, orders) VALUES (?, ?, ?)
>> [2006-05-30 21:43:25,603] [engine]: ['0', 1, '']
>> [2006-05-30 21:43:25,605] [engine]: INSERT INTO classified_page
>> (magazine_page_id, titles) VALUES (?, ?)
>> [2006-05-30 21:43:25,605] [engine]: [0, '']
>> [2006-05-30 21:43:25,607] [engine]: COMMIT
>>
>> As you can see, the inheritance tree works, except that the
>> magazine.page_id and classified.page_id are not being correctly updated.
>>
>> I have included a patch to the test.py I attached in my previous mail.
>>
>> Do I need to create a separate polymorphic_union for ClassifiedPage? and
>> if so, what would that look like?
>>
>> TIA ...
>>
>> Nick
>>
>> Michael Bayer wrote:
>>> Hey Nick -
>>>
>>> I ran this test (which is well-written, youve understood the docs very
>>> well) with my favorite constraint checker, Postgres, and it does in fact
>>> fail on 0.2.1. Fortunately, it does not fail when testing with the
>>> fixes I have just made today, i think its the same issue someone else
>>> raised today (a lot has changed with the persistence mechanism with
>>> regards to inheritance structures recently). Try checking out the
>>> trunk, rev 1554. also, one slight change to your program:
>>
>> [[ snip ]]
>>
>> --- test.py 2006-05-30 21:38:53.000000000 +0100
>> +++ test.py 2006-05-30 21:41:56.000000000 +0100
>> @@ -50,7 +50,7 @@
>> Column('name', String(45), default=''),
>> )
>>
>> -# mapping objects
>> +# set-up mappers
>>
>> class BaseObject(object):
>> def __init__(self, *args, **kwargs):
>> @@ -103,14 +103,11 @@
>> pass
>>
>> class MagazinePage(Page):
>> - def __init__(self, *args, **kwargs):
>> - Page.__init__(self, *args, **kwargs)
>> + pass
>>
>> class ClassifiedPage(MagazinePage):
>> pass
>>
>> -# define mapping
>> -
>> publication_mapper = mapper(Publication, publication_table)
>>
>> issue_mapper = mapper(Issue, issue_table, properties = {
>> @@ -131,6 +128,7 @@
>> page_join = polymorphic_union(
>> {
>> 'm': page_table.join(magazine_page_table),
>> + 'c':
>> page_table.join(magazine_page_table).join(classified_page_table),
>> 'p': page_table.select(page_table.c.type=='p'),
>> }, None, 'page_join')
>>
>> @@ -142,12 +140,10 @@
>> page_mapper = mapper(Page, page_table, select_table=page_join,
>> polymorphic_on=page_join.c.type, polymorphic_identity='p')
>>
>> magazine_page_mapper = mapper(MagazinePage, magazine_page_table,
>> inherits=page_mapper, polymorphic_identity='m', properties={
>> - 'magazine': relation(Magazine)
>> + 'magazine': relation(Magazine, backref=backref('pages',
>> cascade='all, delete-orphan'))
>> })
>>
>> -magazine_mapper.add_property('pages', relation(MagazinePage,
>> lazy=True, private=True))
>> -
>> -#classified_page_mapper = mapper(ClassifiedPage,
>> classified_page_table, inherits=MagazinePage.mapper,
>> polymorphic_identity='c')
>> +classified_page_mapper = mapper(ClassifiedPage,
>> classified_page_table, inherits=magazine_page_mapper,
>> polymorphic_identity='c')
>>
>> session = objectstore.get_session()
>>
>> @@ -166,9 +162,10 @@
>>
>> magazine = Magazine(location=location,size=page_size)
>>
>> -page = MagazinePage(magazine=magazine,page_no=1)
>> +page = ClassifiedPage(magazine=magazine,page_no=1)
>>
>> session.flush()
>> +session.clear()
>>
>> '''
>> p = session.query(Publication).selectone_by(name='Test')
>
[2006-05-31 13:06:38,491] [engine]: show table status like 'classified_page'
[2006-05-31 13:06:38,491] [engine]: None
[2006-05-31 13:06:38,493] [engine]:
DROP TABLE classified_page
[2006-05-31 13:06:38,493] [engine]: None
[2006-05-31 13:06:38,494] [engine]: COMMIT
[2006-05-31 13:06:38,494] [engine]: show table status like 'magazine_page'
[2006-05-31 13:06:38,494] [engine]: None
[2006-05-31 13:06:38,495] [engine]:
DROP TABLE magazine_page
[2006-05-31 13:06:38,495] [engine]: None
[2006-05-31 13:06:38,496] [engine]: COMMIT
[2006-05-31 13:06:38,496] [engine]: show table status like 'page'
[2006-05-31 13:06:38,496] [engine]: None
[2006-05-31 13:06:38,497] [engine]:
DROP TABLE page
[2006-05-31 13:06:38,497] [engine]: None
[2006-05-31 13:06:38,498] [engine]: COMMIT
[2006-05-31 13:06:38,498] [engine]: show table status like 'magazine'
[2006-05-31 13:06:38,498] [engine]: None
[2006-05-31 13:06:38,499] [engine]:
DROP TABLE magazine
[2006-05-31 13:06:38,500] [engine]: None
[2006-05-31 13:06:38,500] [engine]: COMMIT
[2006-05-31 13:06:38,500] [engine]: show table status like 'location'
[2006-05-31 13:06:38,501] [engine]: None
[2006-05-31 13:06:38,512] [engine]:
DROP TABLE location
[2006-05-31 13:06:38,512] [engine]: None
[2006-05-31 13:06:38,512] [engine]: COMMIT
[2006-05-31 13:06:38,513] [engine]: show table status like 'issue'
[2006-05-31 13:06:38,513] [engine]: None
[2006-05-31 13:06:38,514] [engine]:
DROP TABLE issue
[2006-05-31 13:06:38,514] [engine]: None
[2006-05-31 13:06:38,514] [engine]: COMMIT
[2006-05-31 13:06:38,515] [engine]: show table status like 'publication'
[2006-05-31 13:06:38,515] [engine]: None
[2006-05-31 13:06:38,516] [engine]:
DROP TABLE publication
[2006-05-31 13:06:38,516] [engine]: None
[2006-05-31 13:06:38,517] [engine]: COMMIT
[2006-05-31 13:06:38,517] [engine]: show table status like 'page_size'
[2006-05-31 13:06:38,517] [engine]: None
[2006-05-31 13:06:38,518] [engine]:
DROP TABLE page_size
[2006-05-31 13:06:38,518] [engine]: None
[2006-05-31 13:06:38,519] [engine]: COMMIT
[2006-05-31 13:06:38,519] [engine]: show table status like 'location_name'
[2006-05-31 13:06:38,519] [engine]: None
[2006-05-31 13:06:38,520] [engine]:
DROP TABLE location_name
[2006-05-31 13:06:38,520] [engine]: None
[2006-05-31 13:06:38,521] [engine]: COMMIT
[2006-05-31 13:06:38,522] [engine]: show table status like 'location_name'
[2006-05-31 13:06:38,523] [engine]: None
[2006-05-31 13:06:38,524] [engine]:
CREATE TABLE location_name(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(45)
)
[2006-05-31 13:06:38,524] [engine]: None
[2006-05-31 13:06:38,526] [engine]: COMMIT
[2006-05-31 13:06:38,526] [engine]: show table status like 'page_size'
[2006-05-31 13:06:38,526] [engine]: None
[2006-05-31 13:06:38,527] [engine]:
CREATE TABLE page_size(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
width INTEGER,
height INTEGER,
name VARCHAR(45)
)
[2006-05-31 13:06:38,527] [engine]: None
[2006-05-31 13:06:38,529] [engine]: COMMIT
[2006-05-31 13:06:38,530] [engine]: show table status like 'publication'
[2006-05-31 13:06:38,530] [engine]: None
[2006-05-31 13:06:38,531] [engine]:
CREATE TABLE publication(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(45)
)
[2006-05-31 13:06:38,531] [engine]: None
[2006-05-31 13:06:38,533] [engine]: COMMIT
[2006-05-31 13:06:38,533] [engine]: show table status like 'issue'
[2006-05-31 13:06:38,533] [engine]: None
[2006-05-31 13:06:38,534] [engine]:
CREATE TABLE issue(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
publication_id INTEGER, FOREIGN KEY (publication_id) REFERENCES
publication(id),
issue INTEGER
)
[2006-05-31 13:06:38,535] [engine]: None
[2006-05-31 13:06:38,536] [engine]: COMMIT
[2006-05-31 13:06:38,537] [engine]: show table status like 'location'
[2006-05-31 13:06:38,537] [engine]: None
[2006-05-31 13:06:38,538] [engine]:
CREATE TABLE location(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
issue_id INTEGER, FOREIGN KEY (issue_id) REFERENCES issue(id),
ref CHAR(3),
location_name_id INTEGER, FOREIGN KEY (location_name_id) REFERENCES
location_name(id)
)
[2006-05-31 13:06:38,538] [engine]: None
[2006-05-31 13:06:38,540] [engine]: COMMIT
[2006-05-31 13:06:38,541] [engine]: show table status like 'magazine'
[2006-05-31 13:06:38,541] [engine]: None
[2006-05-31 13:06:38,542] [engine]:
CREATE TABLE magazine(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
location_id INTEGER, FOREIGN KEY (location_id) REFERENCES location(id),
page_size_id INTEGER, FOREIGN KEY (page_size_id) REFERENCES
page_size(id)
)
[2006-05-31 13:06:38,542] [engine]: None
[2006-05-31 13:06:38,544] [engine]: COMMIT
[2006-05-31 13:06:38,544] [engine]: show table status like 'page'
[2006-05-31 13:06:38,544] [engine]: None
[2006-05-31 13:06:38,545] [engine]:
CREATE TABLE page(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
page_no INTEGER,
type CHAR(1)
)
[2006-05-31 13:06:38,546] [engine]: None
[2006-05-31 13:06:38,547] [engine]: COMMIT
[2006-05-31 13:06:38,548] [engine]: show table status like 'magazine_page'
[2006-05-31 13:06:38,548] [engine]: None
[2006-05-31 13:06:38,549] [engine]:
CREATE TABLE magazine_page(
page_id INTEGER NOT NULL PRIMARY KEY, FOREIGN KEY (page_id) REFERENCES
page(id),
magazine_id INTEGER, FOREIGN KEY (magazine_id) REFERENCES magazine(id),
orders TEXT
)
[2006-05-31 13:06:38,549] [engine]: None
[2006-05-31 13:06:38,551] [engine]: COMMIT
[2006-05-31 13:06:38,551] [engine]: show table status like 'classified_page'
[2006-05-31 13:06:38,552] [engine]: None
[2006-05-31 13:06:38,553] [engine]:
CREATE TABLE classified_page(
magazine_page_id INTEGER NOT NULL PRIMARY KEY, FOREIGN KEY
(magazine_page_id) REFERENCES magazine_page(page_id),
titles VARCHAR(45)
)
[2006-05-31 13:06:38,553] [engine]: None
[2006-05-31 13:06:38,555] [engine]: COMMIT
[2006-05-31 13:06:38,558] [engine]: SELECT location_name.id AS
location_name_id, location_name.name AS location_name_name
FROM location_name
WHERE location_name.name = %s ORDER BY location_name.id
LIMIT 1
[2006-05-31 13:06:38,558] [engine]: ['London']
[2006-05-31 13:06:38,569] [engine]: BEGIN
[2006-05-31 13:06:38,570] [engine]: INSERT INTO location_name (name) VALUES (%s)
[2006-05-31 13:06:38,570] [engine]: ['London']
[2006-05-31 13:06:38,571] [engine]: INSERT INTO publication (name) VALUES (%s)
[2006-05-31 13:06:38,571] [engine]: ['Test']
[2006-05-31 13:06:38,574] [engine]: INSERT INTO issue (publication_id, issue)
VALUES (%s, %s)
[2006-05-31 13:06:38,574] [engine]: [1L, 46]
[2006-05-31 13:06:38,576] [engine]: INSERT INTO location (issue_id, ref,
location_name_id) VALUES (%s, %s, %s)
[2006-05-31 13:06:38,576] [engine]: [1L, 'ABC', 1L]
[2006-05-31 13:06:38,578] [engine]: INSERT INTO page_size (width, height, name)
VALUES (%s, %s, %s)
[2006-05-31 13:06:38,578] [engine]: [210, 297, 'A4']
[2006-05-31 13:06:38,580] [engine]: INSERT INTO magazine (location_id,
page_size_id) VALUES (%s, %s)
[2006-05-31 13:06:38,580] [engine]: [1L, 1L]
[2006-05-31 13:06:38,583] [engine]: INSERT INTO page (page_no, type) VALUES
(%s, %s)
[2006-05-31 13:06:38,583] [engine]: [2, 'm']
[2006-05-31 13:06:38,585] [engine]: INSERT INTO magazine_page (page_id,
magazine_id, orders) VALUES (%s, %s, %s)
[2006-05-31 13:06:38,585] [engine]: [1L, 1L, '']
[2006-05-31 13:06:38,587] [engine]: INSERT INTO page (page_no, type) VALUES
(%s, %s)
[2006-05-31 13:06:38,587] [engine]: [1, 'c']
[2006-05-31 13:06:38,588] [engine]: INSERT INTO page (page_no, type) VALUES
(%s, %s)
[2006-05-31 13:06:38,589] [engine]: [3, 'c']
[2006-05-31 13:06:38,590] [engine]: INSERT INTO magazine_page (magazine_id,
orders) VALUES (%s, %s)
[2006-05-31 13:06:38,590] [engine]: [1L, '']
/usr/lib/python2.4/site-packages/SQLAlchemy-0.2.1-py2.4.egg/sqlalchemy/engine/default.py:79:
Warning: Field 'page_id' doesn't have a default value
[2006-05-31 13:06:38,603] [engine]: INSERT INTO magazine_page (magazine_id,
orders) VALUES (%s, %s)
[2006-05-31 13:06:38,603] [engine]: [1L, '']
[2006-05-31 13:06:38,604] [engine]: ROLLBACK
Traceback (most recent call last):
File "./test3.py", line 182, in ?
session.flush()
File "build/bdist.linux-i686/egg/sqlalchemy/orm/session.py", line 233, in
flush
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 240, in
flush
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 407, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 687, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 648, in
_execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 687, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 648, in
_execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 687, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 648, in
_execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 687, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 648, in
_execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 687, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 648, in
_execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 687, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 648, in
_execute_childtasks
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 682, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 634, in
_save_objects
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 634, in
_save_objects
File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 632, in
_save_objects
File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 654, in
save_obj
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 240, in
execute
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 264, in
execute_clauseelement
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 280, in
execute_compiled
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 276, in
proxy
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 315, in
_execute_raw
File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 334, in
_execute
sqlalchemy.exceptions.SQLError: (IntegrityError) (1062, "Duplicate entry '0'
for key 1") 'INSERT INTO magazine_page (magazine_id, orders) VALUES (%s, %s)'
[1L, '']