ticket #603 has been added for this issue.

On Jun 12, 2007, at 11:48 PM, David Bolen wrote:

>
> I was converting an older table definition from using an integer
> primary key to a string (representation of UUID), and ran into a bit
> of strange behavior, where my object instance's String primary key
> receives an integer value (which appears to be the internal sqlite
> rowid) after a flush.  From prior reading, I believed that I ought to
> be able to use a non-integer primary key.
>
> I was using 0.3.8 when I first run into this, but it appears to hold
> true for the current SVN trunk as well.
>
> It may just be with the sqlite layer (the DB I've been using and the
> only one I have handy), or it may be an issue with handling default
> values for primary key columns, I'm not sure.
>
> For a short sample exhibiting the problem:
>
>           - - - - - - - - - - - - - - - - - - - - - - - - -
>
> import uuid
> from sqlalchemy import *
> from sqlalchemy.orm import *
>
> engine = create_engine('sqlite:///')
>
> meta = BoundMetaData(engine)
>
> def default_uuid():
>     return str(uuid.uuid4())
>
> test_table = Table(
>     'test', meta,
>     Column('uuid', String, default=default_uuid, primary_key=True),
>     )
>
> class Test(object):
>     pass
>
> test_mapper = mapper(Test, test_table)
>
>
> if __name__ == "__main__":
>
>     meta.create_all()
>     s = create_session(engine)
>
>     test = Test()
>
>     # Works if the line below is uncommented
>     # test.uuid = default_uuid()
>     s.save(test)
>     s.flush()
>     print 'Post-Flush:', test.uuid
>
>     u = test_table.select().execute().fetchone()
>     print 'DB:', u
>
>           - - - - - - - - - - - - - - - - - - - - - - - - -
>
>
> When run as is above, the output for me looks like:
>
> Post-Flush: 1
> DB: (u'1cfcb156-2a90-42ec-9c96-75a4b8bf60e7',)
>
> (If you enable tracing on the engine, you can see that the actual uuid
>  column value inserted into the database during the flush is, in fact,
>  the data shown from the select, which doesn't match that in the  
> object
>  instance in memory following the flush)
>
> Running with the commented line (manual key assignment)  
> uncommented, yields:
>
> Post-Flush: d05ebdde-267f-43ae-a7df-f6d588e431a2
> DB: (u'd05ebdde-267f-43ae-a7df-f6d588e431a2',)
>
> which is what I originally expected for the first case.
>
> Now, I know that sqlite is internally creating a rowid field since I
> don't have an Integer primary key, and I'm presuming that's what the
> erroneous 1 value is in the first case (it is, in fact, an 'int', not
> a string), but I don't know why it's being assigned to my in-memory
> copy of the object, and since that's the primary key field, it no
> longer maps properly to the database.
>
> Am I doing something wrong in the above?
>
> Thanks.
>
> -- David
>
>
> >


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to