wow, nice job. I have to write a test for that but that's a definite high priority for the next SQLA release: http://www.sqlalchemy.org/trac/ticket/2539
On Jul 25, 2012, at 5:35 PM, Tim wrote: > I think I've found what is causing my problems. See > http://paste.ofcode.org/38cMYRa7u268EsuUnWQXjfg > > Also, I want to thank you for you help. It is very much appreciated. > > Tim > > On Monday, July 23, 2012 10:15:12 PM UTC-4, Michael Bayer wrote: > the sqlalchemy.types.TIMESTAMP type has dbapi.TIMESTAMP established as the > DBAPI type object to use. When the cx_oracle dialect is in use, the > cursor.setinputsizes() method is called, passing in a value for every type > that has a "dbapi" type defined with it, with the exception of a handful of > string types which I've observed cause cx_oracle to make poorer decisions. > > So when you use sqlalchemy.types.TIMESTAMP, setinputsizes() should be called > for any statement where the type is known. This should be the case for the > version_id criteria used by the ORM. > > If you use a TypeDecorator with get_dbapi_type(), that may or may not work in > this particular case - it's very possible that your custom TypeDecorator is > reduced to its underlying type object before get_dbapi_type() is called. > > > > > On Jul 23, 2012, at 1:45 PM, Tim wrote: > >> I used TypeDecorator and get_dbapi_type to return the type object I wanted. >> >> The parameters get the type cx_Oracle.TIMESTAMP for any filtering I do >> myself, but the ones used in the version feature seem to ignore this and >> thus still fail to locate the row. >> >> On Friday, July 20, 2012 4:12:45 PM UTC-4, Tim wrote: >> The microseconds are getting in the way and getting rid of them does work. >> Unfortunately, the trigger does not get rid of them and there are several >> applications which write to these tables and depend on the microseconds. >> >> It seems to work in cx_Oracle if I call the setinputsizes and use >> cx_Oracle.TIMESTAMP as the input size. Do you have some suggestions on how >> to add this to a custom type, or a decorated type? >> >> On Friday, July 20, 2012 11:31:26 AM UTC-4, Michael Bayer wrote: >> >> On Jul 20, 2012, at 11:19 AM, Tim wrote: >> >>> The first thing I did after I started having problems was remove the >>> trigger (the above was without the trigger in place). >>> >>> That being said, it appears that I am having trouble with cx_Oracle and not >>> SQLAlchemy. Using cx_Oracle directly, I can select a row by id, getting the >>> timestamp. Then I try to select the row again, this time also using the >>> timestamp I just retrieved, and get nothing. >>> >>> Thank you for your help. >> >> ah - you might want to truncate those microseconds off of your timestamp, >> they're possibly getting in the way. >> >> >>> >>> On Thursday, July 19, 2012 11:41:50 PM UTC-4, Michael Bayer wrote: >>> you'd have to check cx_oracle's behavior here in conjunction with your >>> trigger (I'm assuming you're using a trigger here based on your previous >>> message). SQLAlchemy, as you can see below, runs the UPDATE statement, >>> adding the current known version to the WHERE criterion. It then checks >>> the matched row count, which is on the DBAPI as cursor.rowcount, that the >>> row actually matched, indicating that the row intended to be UPDATED was >>> located and in fact had the correct version. If your trigger is >>> interfering with cx_oracle's ability to return the correct rowcount, then >>> you'd get this issue. So you'd need to distill your test case into a >>> cx_oracle script that emits the intended UPDATE statement, including the >>> version criterion, and then confirm that cursor.rowcount is in fact >>> returning the correct number. The trigger you're doing might be getting in >>> the way. >>> >>> If you aren't using a trigger at all, and this is just default "version" >>> behavior, that should be working as we do have tests here which we run >>> against cx_oracle with success. >>> >>> >>> On Jul 19, 2012, at 11:01 PM, Tim wrote: >>> >>>> I can not get versioning to work in Oracle (it does work for me in sqlite >>>> and Postgresql just changing the connect string). >>>> >>>> I am using timestamp with time zones for the version_id_col. Can anyone >>>> verify that this does work. >>>> >>>> SQLAlchemy==0.7.8 >>>> cx-Oracle==5.1.2 >>>> >>>> Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) >>>> [GCC 4.4.5] on linux2 >>>> >>>> >>> import ver.models as m; import transaction >>>> >>> s = m.DBSession() >>>> >>> i = s.query(m.MyModel).first() >>>> 2012-07-19 22:32:54,807 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> SELECT USER FROM DUAL >>>> 2012-07-19 22:32:54,807 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> {} >>>> 2012-07-19 22:32:54,818 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> BEGIN (implicit) >>>> 2012-07-19 22:32:54,819 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> SELECT models_id, models_name, models_value, models_ins_upd_timestamp >>>> FROM (SELECT models.id AS models_id, models.name AS models_name, >>>> models.value AS models_value, models.ins_upd_timestamp AS >>>> models_ins_upd_timestamp >>>> FROM models) >>>> WHERE ROWNUM <= :ROWNUM_1 >>>> 2012-07-19 22:32:54,819 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> {'ROWNUM_1': 1} >>>> >>> i.value += 1 >>>> >>> transaction.commit() >>>> 2012-07-19 22:33:18,656 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> UPDATE models SET value=:value, ins_upd_timestamp=:ins_upd_timestamp WHERE >>>> models.id = :models_id AND models.ins_upd_timestamp = >>>> :models_ins_upd_timestamp >>>> 2012-07-19 22:33:18,656 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> {'ins_upd_timestamp': datetime.datetime(2012, 7, 19, 22, 33, 18, 655856), >>>> 'models_ins_upd_timestamp': datetime.datetime(2012, 7, 19, 22, 31, 46, >>>> 814740), 'value': 2, 'models_id': 1} >>>> 2012-07-19 22:33:18,659 INFO [sqlalchemy.engine.base.Engine][MainThread] >>>> ROLLBACK >>>> Traceback (most recent call last): >>>> File "<console>", line 1, in <module> >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/transaction-1.3.0-py2.6.egg/transaction/_manager.py", >>>> line 107, in commit >>>> return self.get().commit() >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/transaction-1.3.0-py2.6.egg/transaction/_transaction.py", >>>> line 354, in commit >>>> reraise(t, v, tb) >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/transaction-1.3.0-py2.6.egg/transaction/_transaction.py", >>>> line 345, in commit >>>> self._commitResources() >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/transaction-1.3.0-py2.6.egg/transaction/_transaction.py", >>>> line 493, in _commitResources >>>> reraise(t, v, tb) >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/transaction-1.3.0-py2.6.egg/transaction/_transaction.py", >>>> line 465, in _commitResources >>>> rm.tpc_begin(self) >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/zope.sqlalchemy-0.7.1-py2.6.egg/zope/sqlalchemy/datamanager.py", >>>> line 86, in tpc_begin >>>> self.session.flush() >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/SQLAlchemy-0.7.8-py2.6-linux-i686.egg/sqlalchemy/orm/session.py", >>>> line 1583, in flush >>>> self._flush(objects) >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/SQLAlchemy-0.7.8-py2.6-linux-i686.egg/sqlalchemy/orm/session.py", >>>> line 1654, in _flush >>>> flush_context.execute() >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/SQLAlchemy-0.7.8-py2.6-linux-i686.egg/sqlalchemy/orm/unitofwork.py", >>>> line 331, in execute >>>> rec.execute(self) >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/SQLAlchemy-0.7.8-py2.6-linux-i686.egg/sqlalchemy/orm/unitofwork.py", >>>> line 475, in execute >>>> uow >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/SQLAlchemy-0.7.8-py2.6-linux-i686.egg/sqlalchemy/orm/persistence.py", >>>> line 59, in save_obj >>>> mapper, table, update) >>>> File >>>> "/home/timw/.virtualenvs/sat/lib/python2.6/site-packages/SQLAlchemy-0.7.8-py2.6-linux-i686.egg/sqlalchemy/orm/persistence.py", >>>> line 504, in _emit_update_statements >>>> (table.description, len(update), rows)) >>>> StaleDataError: UPDATE statement on table 'models' expected to update 1 >>>> row(s); 0 were matched. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google Groups >>>> "sqlalchemy" group. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msg/sqlalchemy/-/-_uLzovXdkgJ. >>>> 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 view this discussion on the web visit >>> https://groups.google.com/d/msg/sqlalchemy/-/nBweg95AeCwJ. >>> 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 view this discussion on the web visit >> https://groups.google.com/d/msg/sqlalchemy/-/tiMo6LLnpQEJ. >> 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 view this discussion on the web visit > https://groups.google.com/d/msg/sqlalchemy/-/HJ3XcaBdb9MJ. > 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.