hi. the reason for the flush strangeness is I grabbed these
statements from separate areas of the app to reproduce the scenario
(but I guess the app needs cleanup, heh).
What version of pysqilte did you test with? Mine is pysqlite 2.3.2 on
python 2.4.3, sqlalchemy dev r 2183; maybe that's all it is (memory
weirdness).
below is my sql, output, etc, showing the same test failing for me.
I see what you mean about the sqlite instances. Actually when I run
it w/ the 2nd call as a connection to postgres, there are no errors.
Since that is a better representation of my real problem I'm not so
worried about the failure anymore. And currently I'm working around
it all using two separate BoundMetaData which is OK to me. But I'm
still curious as to what could be wrong with my setup.
_
2007-01-11 19:16:55,779 INFO sqlalchemy.engine.base.Engine.0x..30
PRAGMA table_info(offers)
2007-01-11 19:16:55,779 INFO sqlalchemy.engine.base.Engine.0x..30 {}
2007-01-11 19:16:55,781 INFO sqlalchemy.engine.base.Engine.0x..30
CREATE TABLE offers (
id INTEGER NOT NULL,
name TEXT,
PRIMARY KEY (id)
)
2007-01-11 19:16:55,781 INFO sqlalchemy.engine.base.Engine.0x..30 None
2007-01-11 19:16:55,782 INFO sqlalchemy.engine.base.Engine.0x..30 COMMIT
2007-01-11 19:16:55,784 INFO sqlalchemy.engine.base.Engine.0x..30 BEGIN
2007-01-11 19:16:55,786 INFO sqlalchemy.engine.base.Engine.0x..30
INSERT INTO offers (name) VALUES (?)
2007-01-11 19:16:55,786 INFO sqlalchemy.engine.base.Engine.0x..30 ['foobar']
2007-01-11 19:16:55,787 INFO sqlalchemy.engine.base.Engine.0x..30 COMMIT
2007-01-11 19:16:55,790 INFO sqlalchemy.engine.base.Engine.0x..30
SELECT offers.id AS offers_id, offers.name AS offers_name
FROM offers ORDER BY offers.oid
2007-01-11 19:16:55,790 INFO sqlalchemy.engine.base.Engine.0x..30 []
2007-01-11 19:16:55,791 INFO sqlalchemy.engine.base.Engine.0x..30 BEGIN
2007-01-11 19:16:55,792 INFO sqlalchemy.engine.base.Engine.0x..30
DELETE FROM offers WHERE offers.id = ?
2007-01-11 19:16:55,793 INFO sqlalchemy.engine.base.Engine.0x..30 [1]
2007-01-11 19:16:55,793 INFO sqlalchemy.engine.base.Engine.0x..30 COMMIT
2007-01-11 19:16:55,794 INFO sqlalchemy.engine.base.Engine.0x..30
SELECT offers.id AS offers_id, offers.name AS offers_name
FROM offers ORDER BY offers.oid
2007-01-11 19:16:55,795 INFO sqlalchemy.engine.base.Engine.0x..30 []
2007-01-11 19:16:55,796 INFO sqlalchemy.engine.base.Engine.0x..30
PRAGMA table_info(offers)
2007-01-11 19:16:55,796 INFO sqlalchemy.engine.base.Engine.0x..30 {}
2007-01-11 19:16:55,796 INFO sqlalchemy.engine.base.Engine.0x..30
DROP TABLE offers
2007-01-11 19:16:55,797 INFO sqlalchemy.engine.base.Engine.0x..30 None
2007-01-11 19:16:55,797 INFO sqlalchemy.engine.base.Engine.0x..30 COMMIT
2007-01-11 19:16:55,799 INFO sqlalchemy.engine.base.Engine.0x..30
PRAGMA table_info(offers)
2007-01-11 19:16:55,799 INFO sqlalchemy.engine.base.Engine.0x..30 {}
2007-01-11 19:16:55,800 INFO sqlalchemy.engine.base.Engine.0x..30
CREATE TABLE offers (
id INTEGER NOT NULL,
name TEXT,
PRIMARY KEY (id)
)
2007-01-11 19:16:55,800 INFO sqlalchemy.engine.base.Engine.0x..30 None
2007-01-11 19:16:55,800 INFO sqlalchemy.engine.base.Engine.0x..30 COMMIT
2007-01-11 19:16:55,802 INFO sqlalchemy.engine.base.Engine.0x..30 BEGIN
2007-01-11 19:16:55,803 INFO sqlalchemy.engine.base.Engine.0x..30
INSERT INTO offers (name) VALUES (?)
2007-01-11 19:16:55,803 INFO sqlalchemy.engine.base.Engine.0x..30 ['foobar']
2007-01-11 19:16:55,804 INFO sqlalchemy.engine.base.Engine.0x..30 COMMIT
2007-01-11 19:16:55,805 INFO sqlalchemy.engine.base.Engine.0x..30
SELECT offers.id AS offers_id, offers.name AS offers_name
FROM offers ORDER BY offers.oid
2007-01-11 19:16:55,805 INFO sqlalchemy.engine.base.Engine.0x..30 []
2007-01-11 19:16:55,806 INFO sqlalchemy.engine.base.Engine.0x..30 BEGIN
2007-01-11 19:16:55,807 INFO sqlalchemy.engine.base.Engine.0x..30
DELETE FROM offers WHERE offers.id = ?
2007-01-11 19:16:55,807 INFO sqlalchemy.engine.base.Engine.0x..30 [1]
2007-01-11 19:16:55,808 INFO sqlalchemy.engine.base.Engine.0x..30 ROLLBACK
Traceback (most recent call last):
File "test_sa_concurrent.py", line 56, in ?
db_roundtrip('sqlite:///:memory:')
File "test_sa_concurrent.py", line 42, in db_roundtrip
session.flush()
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/session.py",
line 220, in flush
self.uow.flush(self, objects)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 194, in flush
flush_context.execute()
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 333, in execute
head.execute(self)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 470, in execute
UOWExecutor().execute(trans, self)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 795, in execute
self.execute_delete_steps(trans, task)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 824, in execute_delete_steps
self.delete_objects(trans, task)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 801, in delete_objects
task._delete_objects(trans)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py",
line 464, in _delete_objects
task.mapper.delete_obj(task.todelete_objects, trans)
File "/Users/kumar/src/sqlalchemy/lib/sqlalchemy/orm/mapper.py",
line 1070, in delete_obj
raise exceptions.ConcurrentModificationError("Updated rowcount %d
does not match number of objects updated %d" % (c.cursor.rowcount,
len(delete)))sqlalchemy.exceptions.ConcurrentModificationError:
Updated rowcount 0 does not match number of objects updated 1
On 1/6/07, Michael Bayer <[EMAIL PROTECTED]> wrote:
>
> when i run this program, I get no errors.
>
> a few things to note:
>
> it makes no sense to do a session.flush() after youve dropped the
> table (similarly, it makes no sense to flush() before youve done
> anything but thats less of an issue). if there were any modified
> state within your session to actually be flushed, the operation would
> fail since the table is dropped (but in this test, theres no changes
> to flush at that point, so no error occurs).
>
> running the same test twice with two separate instances of "sqlite://
> memory" will produce no continuity between the two databases, since
> sqlite://memory databases are completely unique per connection. but
> again, in this test youre doing a completely new and unrelated set of
> operations on each connection, so no error occurs.
>
> wild guess, that the test you have which fails is switching between
> "sqlite://memory" databases within a single ORM session, so the
> update of a row saved within the first sqlite://memory database
> produces no changes within the second sqlite://memory database since
> its a completely new database (but then, youd also have to get the
> table creates in there too, so still not exactly sure what the
> conditions are on your end).
>
> in any case, viewing SQL output should reveal exactly whats going on.
>
>
> On Jan 6, 2007, at 6:54 PM, Kumar McMillan wrote:
>
> > hello.
> >
> > I'm trying to use DynamicMetaData so that two separate tests can each
> > connect to a unique db, create some tables, insert some data, delete
> > that data, then drop the tables.
> >
> > This seems to yield ...
> >
> > sqlalchemy.exceptions.ConcurrentModificationError: Updated rowcount 0
> > does not match number of objects updated 1
> >
> > ... the second time around, when trying to delete the data. I checked
> > the list and FAQ and note that I am *not* trying to modify a primary
> > key. This seems related to the use of DynamicMetaData and the fact
> > that I am creating the table then dropping it.
> >
> > I was able to reproduce this scenario in a single test (below and
> > attached) so maybe you can see something simple I'm doing wrong?
> > Experimenting, I noticed that if I use two separate BoundMetaData
> > instances *or* switch to checkfirst=True and not drop the table then
> > the test works fine. However, I don't see why this shouldn't be
> > possible with DynamicMetaData. Thanks in advance.
> >
> > PS. this was in sqlalchemy trunk r 2183
> >
> > _
> >
> > import sqlalchemy
> > from sqlalchemy import *
> > from sqlalchemy.ext.assignmapper import assign_mapper
> > from sqlalchemy.ext.sessioncontext import SessionContext
> > def eq_(a,b):
> > assert a==b, "%s != %s" % (a,b)
> >
> > meta = DynamicMetaData()
> >
> > offers = Table("offers", meta,
> > Column("id", INT, primary_key=True),
> > Column("name", String ),
> > )
> > class Offer(object):
> > pass
> >
> > def db_roundtrip(dsn):
> > conn = meta.connect(dsn)
> > meta.engine.echo = 1
> >
> > context = SessionContext(
> > lambda: sqlalchemy.create_session(bind_to=meta.engine))
> > assign_mapper(context, Offer, offers)
> > session = context.current
> >
> > meta.create_all()
> > session.flush()
> >
> > offer = Offer()
> > offer.name = 'foobar'
> > session.save(offer)
> > session.flush()
> >
> > rows = Offer.select()
> > eq_(len(rows), 1)
> > eq_(rows[0].id, 1)
> > eq_(rows[0].name, 'foobar')
> >
> > session.delete(offer)
> > session.flush()
> >
> > rows = Offer.select()
> > eq_(len(rows), 0)
> >
> > meta.drop_all()
> > session.flush()
> >
> > sqlalchemy.orm.clear_mappers()
> >
> > if __name__ == '__main__':
> >
> > db_roundtrip('sqlite:///:memory:')
> > # pretend this is another connection :
> > db_roundtrip('sqlite:///:memory:')
> >
> > print 'OK'
> >
> > >
> > <test_sa_concurrent.py>
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---