the "arraysize=50" default is set up in r4827 on the 0.4 branch and  
r4828 on the trunk.   I was surprised to find the rules for "BLOB no  
longer accesssible" are different than what I had assumed they were,  
so binary results and all work just fine here.


On May 27, 2008, at 5:34 PM, gniquil wrote:

>
> Hey, i did a test included below with this output:
>
> $ python cxotest.py
> Setting arraysize to 1 before execution yields 25.8921508181
> Setting arraysize to 500 before execution yields 0.26524348765
> Setting arraysize to 1 after execution yields 25.8829982582
> Setting arraysize to 500 after execution yields 25.8650820146
>
>
> /* sql code for the table */
> begin
>  for i in 1..10000
>  Loop
>    insert into testtable
>    (id, name)
>    values
>    (i, 'abcde');
>  end loop;
> end;
>
> #python code#################################
>
> from cx_Oracle import connect, Cursor
>
> conn = connect('username', 'password', 'testaccount')
> curs = Cursor(conn)
>
> def fetchdata_preset(sql, arraysize=1, n=1000):
>    curs.arraysize = arraysize
>    curs.execute(sql)
>    curs.fetchmany(n)
>
> def fetchdata_postset(sql, arraysize=1, n=1000):
>    curs.arraysize = 1 #make sure this is set back to default
>    curs.execute(sql)
>    curs.arraysize = arraysize
>    curs.fetchmany(n)
>
>
> if __name__ == '__main__':
>    from timeit import Timer
>
>    sql = "\'select * from testtable\'"
>
>    t1a = Timer("fetchdata_preset(%s,1,1000)" % sql,
>                "from __main__ import fetchdata_preset")
>    t1b = Timer("fetchdata_preset(%s,500,1000)" % sql,
>                "from __main__ import fetchdata_preset")
>    t2a = Timer("fetchdata_postset(%s,1,1000)" % sql,
>                "from __main__ import fetchdata_postset")
>    t2b = Timer("fetchdata_postset(%s,500,1000)" % sql,
>                "from __main__ import fetchdata_postset")
>
>    statement = "Setting arraysize to %s %s execution yields %s"
>
>    print statement % (str(1), "before", str(t1a.timeit(1)))
>    print statement % (str(500), "before", str(t1b.timeit(1)))
>    print statement % (str(1), "after", str(t2a.timeit(1)))
>    print statement % (str(500), "after", str(t2b.timeit(1)))
>
>
>
> On May 27, 1:21 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
>> On May 27, 2008, at 3:21 PM, Waldemar Osuch wrote:
>>
>>> Quote:
>>
>>> Up to this point the default arraysize is 1 meaning that a single  
>>> row
>>> is internally fetched at a time. This has nothing to do with
>>> fetchone(), fetchmany() or fetchall(). Regardless of which of those
>>> methods is used, internally cx_Oracle fetches one row at a time. If
>>> you change the arraysize to 50, internally cx_Oracle will fetch 50
>>> rows at a time. Again, this is regardless of whether you use
>>> fetchone(), fetchmany() or fetchall(). Some of the confusion may lie
>>> in the fact that the default value for rows to fetch in  
>>> fetchmany() is
>>> the arraysize -- but that is all it is, a default value!
>>
>> see, that's a really unfortunate decision on his part to reuse
>> "arraysize" in such an arbitrary way like that, while *not* using it
>> at the point at which it is entirely reasonable, that is when you  
>> have
>> already stated you want to fetchmany(n) or fetchall().  This is
>> totally a bug in cx_oracle.
>>
>>
>>
>>
>>
>>> class MyConnection(cx_Oracle.Connection):
>>
>>>   def cursor(self):
>>>       cursor = cx_Oracle.Cursor(self)
>>>       cursor.arraysize = 50
>>>       return cursor
>>
>>> What this does is automatically set the arraysize to 50 every time a
>>> cursor is created. This can be done to transparently set the  
>>> arraysize
>>> and should allow you to proceed with whatever code needs to assume  
>>> an
>>> arraysize of that value. Otherwise you can feel free to change it
>>> yourself after creating the cursor.
>>
>>> And as has already been noted, in the next release of cx_Oracle, the
>>> default arraysize will be 50 in order to resolve this problem
>>> "permanently". :-)
>>
>> that workaround works, and also implementing "default_arraysize"
>> within OracleDialect as follows is acceptable.   If someone can test
>> this and post a trac ticket I can commit this to 0.4/0.5:
>>
>> Index: lib/sqlalchemy/databases/oracle.py
>> ===================================================================
>> --- lib/sqlalchemy/databases/oracle.py  (revision 4819)
>> +++ lib/sqlalchemy/databases/oracle.py  (working copy)
>> @@ -213,6 +213,12 @@
>>                       self.out_parameters[name] =
>> self.cursor.var(dbtype)
>>                       self.parameters[0][name] =
>> self.out_parameters[name]
>>
>> +    def create_cursor(self):
>> +        cursor = self._connection.connection.cursor()
>> +        if self.dialect.default_arraysize:
>> +            cursor.arraysize = self.dialect.default_arraysize
>> +        return cursor
>> +
>>       def get_result_proxy(self):
>>           if hasattr(self, 'out_parameters'):
>>               if self.compiled_parameters is not None and
>> len(self.compiled_parameters) == 1:
>> @@ -242,8 +248,9 @@
>>       supports_pk_autoincrement = False
>>       default_paramstyle = 'named'
>>
>> -    def __init__(self, use_ansi=True, auto_setinputsizes=True,
>> auto_convert_lobs=True, threaded=True, allow_twophase=True,  
>> **kwargs):
>> +    def __init__(self, use_ansi=True, auto_setinputsizes=True,
>> auto_convert_lobs=True, threaded=True, allow_twophase=True,
>> default_arraysize=None, **kwargs):
>>           default.DefaultDialect.__init__(self, **kwargs)
>> +        self.default_arraysize = default_arraysize
>>           self.use_ansi = use_ansi
>>           self.threaded = threaded
>>           self.allow_twophase = allow_twophase
> >


--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to