On Mar 2, 2011, at 5:32 PM, Michael Bayer wrote:

> 
> On Mar 2, 2011, at 5:13 PM, Michael Bayer wrote:
> 
>> Sequence() is a DDL construct, not a SQL construct, so you don't embed it 
>> into an INSERT statement directly, nor can you assign it to an attribute on 
>> a mapped object (as would appear to be the case here).  It is a marker 
>> applied to a Column() object to note the column's generator for default 
>> values.
>> 
>> The usage of Sequence in table metadata is described at:
>> 
>>      http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences
>> 
>> When using the ORM in particular, the Sequence needs to be used in this way 
>> so that SQLAlchemy has a means of acquiring the newly generated identifier. 
>> On Firebird, when the Table metadata has a Sequence associated, the gen_id() 
>> function is embedded inline and the new identifier is acquired via 
>> RETURNING.   This applies to all insert() constructs generated against the 
>> Table object, not just those used by the ORM.
>> 
>> Another option is to explicitly execute the sequence object ahead of time - 
>> a Sequence can be passed to the execute() method of any 
>> engine/connection/Session to invoke its next id.    This is not the best 
>> pattern in conjunction with inserts:
>> 
>>      myobject.id = Session.execute(my_sequence_object)
> 
> continuing, not the best pattern because, its two separate executions instead 
> of one and is more verbose in any case.

and, I'd add we can make it actually work the way you thought it did, by 
letting you say myobject.id = sequence.nextval(), we will see if we can get 
that into 0.7.0.



> 
> 
> 
> 
>> 
>> 
>> 
>> 
>> 
>> On Mar 2, 2011, at 3:10 PM, bigt wrote:
>> 
>>> my Firebird database has some Sequence values defined as
>>> 
>>> CREATE SEQUENCE S_org;
>>> 
>>> with an appropriate trigger to set a value.
>>> 
>>> RECREATE TRIGGER TBI_org FOR org
>>> ACTIVE BEFORE INSERT POSITION 0
>>> AS BEGIN
>>>  IF (NEW.Id IS NULL) THEN
>>>    NEW.Id = NEXT VALUE FOR S_org;
>>>  END^
>>> 
>>> 
>>> Using reflection in sqlalchemy i get an error when trying to store an
>>> entry in the ORG table.
>>> 
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
>>> line 1392, in flush
>>>  self._flush(objects)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
>>> line 1473, in _flush
>>>  flush_context.execute()
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/
>>> unitofwork.py", line 302, in execute
>>>  rec.execute(self)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/
>>> unitofwork.py", line 446, in execute
>>>  uow
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py",
>>> line 1884, in _save_obj
>>>  execute(statement, params)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
>>> line 1191, in execute
>>>  params)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
>>> line 1271, in _execute_clauseelement
>>>  return self.__execute_context(context)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
>>> line 1302, in __execute_context
>>>  context.parameters[0], context=context)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
>>> line 1401, in _cursor_execute
>>>  context)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py",
>>> line 1394, in _cursor_execute
>>>  context)
>>> File "/usr/lib/python2.7/site-packages/sqlalchemy/dialects/firebird/
>>> base.py", line 680, in do_execute
>>>  cursor.execute(statement, parameters or [])
>>> InterfaceError: (InterfaceError) (0L, "Error while attempting to
>>> convert object of type <class 'sqlalchemy.schema.Sequence'> to
>>> database-internal numeric type for storage in field [name not known at
>>> this stage of query execution].  The invalid input object is:
>>> Sequence(u's_org', start=1, increment=1, optional=False)") 'INSERT
>>> INTO org (id, name, contact, dept, vatnr, country, city, street,
>>> building, postcode, phone, fax, email) VALUES
>>> (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' (Sequence(u's_org', start=1,
>>> increment=1, optional=False), u'xyz', None, None, None, u'CH', None,
>>> None, None, None, None, None, None)
>>> 
>>> 
>>> It appears that Sqlalchemy does not process correctly  the  SEQUENCE
>>> keyword in recent versions of Firebird
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "sqlalchemy" group.
>>> 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.
>>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> 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.
>> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> 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.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
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