Hi!

Just want to ask how long this still takes to fix? We like to use stored 
procedures for MySQL queries. After an executesql( "CALL... everything 
gives this error - even commit() and rollback(). This only happens if the 
procedure wants to give back a result. I have tried to fetch it manually 
through the cursor but no luck.

Could you point me to a solution or workaround other than write all queries 
by hand? Maybe it could be implemented as an execute_multiple or 
call_procedure function aside from the normal workings to not mess things 
up in the current DAL?

Thanks,
rawbits



2013. január 25., péntek 19:44:06 UTC+1 időpontban Massimo Di Pierro a 
következőt írta:
>
> True. For now you need to separate calls to db.executesql if you have 
> multiple queries.
>
> On Friday, 25 January 2013 11:54:18 UTC-6, AngeloC wrote:
>>
>> Hi Massimo,
>>
>> I think this is a real problem.
>>
>> In a web2py shell you can do:
>>
>> rows = db.executesql("select * from charts")
>>
>> but you cannot do:
>>
>> rows = db.executesql("select * from charts; select * from charts;")
>>
>> it raises the error above.
>>
>> I think the problem is related to multiple resultsets. That example query 
>> return 2 resultset, as well a stored procedure could return multiple 
>> resultset. I think web2py mess something when a multiquery or a stored 
>> procudere returns more than one resultset.
>>
>>
>> Mysql user guide says here (
>> http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html):
>>
>> If you get Commands out of sync; you can't run this command now in your 
>> client code, you are calling client functions in the wrong order.
>>
>> This can happen, for example, if you are using mysql_use_result() 
>> <http://dev.mysql.com/doc/refman/5.0/en/mysql-use-result.html> and try 
>> to execute a new query before you have called mysql_free_result() 
>> <http://dev.mysql.com/doc/refman/5.0/en/mysql-free-result.html>. It can 
>> also happen if you try to execute two queries that return data without 
>> calling mysql_use_result() 
>> <http://dev.mysql.com/doc/refman/5.0/en/mysql-use-result.html> or 
>> mysql_store_result() 
>> <http://dev.mysql.com/doc/refman/5.0/en/mysql-store-result.html> in 
>> between.
>>
>>
>>
>> 2012/9/28 Yarin <[email protected]>
>>
>>> Done: http://code.google.com/p/web2py/issues/detail?id=1037
>>>
>>>
>>> On Thursday, September 27, 2012 4:33:37 PM UTC-4, Massimo Di Pierro 
>>> wrote:
>>>>
>>>> Is this issue still open? If so, can you open a ticket about it?
>>>>
>>>> Massimo
>>>>
>>>> On Monday, 24 September 2012 14:38:14 UTC-5, Yarin wrote:
>>>>>
>>>>>
>>>>>
>>>>> db.py:
>>>>> db.define_table('mytable',Field('myfield','string'))
>>>>>
>>>>> sproc:
>>>>> DELIMITER //
>>>>> CREATE PROCEDURE TestSproc()
>>>>>   BEGIN
>>>>>   SELECT COUNT(*) FROM mytable;
>>>>>   END //
>>>>> DELIMITER;
>>>>>
>>>>> tests.py
>>>>> """NOTE: Tests 1-3 will fail every time in wsgi/linux environments. 
>>>>> From the web2py command line, they will work once, until another 
>>>>> operation is called on the db, INCLUDING commit().
>>>>>
>>>>> In web2py 1, you can run these once successfully, but subsequent sql 
>>>>> operations on the current connection return None results.
>>>>> """
>>>>>
>>>>> def test_1():
>>>>>  ''' RESULT: ProgrammingError: (2014, "Commands out of sync; you cant 
>>>>> run this command now") '''
>>>>>  
>>>>>  sql = '''CALL TestSproc();'''
>>>>>  results = db.executesql(sql, as_dict=True)
>>>>>  return str(results)
>>>>>  
>>>>> def test_2():
>>>>>  ''' RESULT: ProgrammingError: (2014, "Commands out of sync; you cant 
>>>>> run this command now") '''
>>>>>  
>>>>>  sql = """CALL TestSproc();"""
>>>>>  results = db.executesql(sql, as_dict=True)
>>>>>  db.commit()
>>>>>  return str(results)
>>>>>  
>>>>> def test_3():
>>>>>  ''' RESULT: ProgrammingError: (2014, "Commands out of sync; you cant 
>>>>> run this command now") '''
>>>>>  
>>>>>  sql = """CALL TestSproc();"""
>>>>>  db._adapter.execute(sql)
>>>>>  results = db._adapter.cursor.fetchall()
>>>>>  return str(results)
>>>>>  
>>>>> def test_4():
>>>>>  ''' RESULT: Works '''
>>>>>  
>>>>>  import contrib.pymysql as pymysql
>>>>>  sql = """CALL TestSproc();"""
>>>>>  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', 
>>>>> passwd='root', db='test')
>>>>>  cur = conn.cursor(pymysql.cursors.DictCursor)
>>>>>  cur.execute(sql)
>>>>>  results = cur.fetchall()
>>>>>  cur.close()
>>>>>  conn.close()
>>>>>  return str(results)
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Monday, September 24, 2012 1:10:14 PM UTC-4, Massimo Di Pierro 
>>>>> wrote:
>>>>>>
>>>>>> can you show us some of your code. This may be a concurrency issues. 
>>>>>> I cannot thing anything we change that would affect the behavior.
>>>>>>
>>>>>> On Sunday, 23 September 2012 22:43:28 UTC-5, Yarin wrote:
>>>>>>>
>>>>>>> After upgrading to web2py 2.0, we can no longer use the DAL or mysql 
>>>>>>> adapters to make MySQL stored procedure calls.
>>>>>>>
>>>>>>> In web2py 1.x I had reported 
>>>>>>> <https://groups.google.com/d/msg/web2py/VaGJjwE3eYQ/GPa3xRe-HVsJ> 
>>>>>>> how mysql stored procedures weren't working for us in certain 
>>>>>>> circumstances- however we were able to circumvent those issues by 
>>>>>>> simply 
>>>>>>> creating a new DAL instance everytime we had to call a sproc. With the 
>>>>>>> new 
>>>>>>> DAL, that's no longer an option- indeed, any call to a stored procedure 
>>>>>>> seems to fail in any attempt through the DAL or mysql adapter. 
>>>>>>>
>>>>>>>    - Fails with both pymysql and mysqldb drivers
>>>>>>>    - Fails when calling commit() immediately after
>>>>>>>    - We did side-by-side comparisons with web2py 1.x on same 
>>>>>>>    server, pointing to same db, and confirmed this fails only in 2.0 
>>>>>>>    - You can make sproc calls using the DAL straight from the 
>>>>>>>    web2py shell, but only if you don't call commit. 
>>>>>>>
>>>>>>>
>>>>>>> Stack trace:
>>>>>>>
>>>>>>> Traceback (most recent call last):
>>>>>>>   File "/opt/web-apps/web2py/gluon/main.py", line 580, in wsgibase
>>>>>>>
>>>>>>>
>>>>>>>     BaseAdapter.close_all_instances('rollback')
>>>>>>>   File "/opt/web-apps/web2py/gluon/dal.py", line 511, in 
>>>>>>> close_all_instances
>>>>>>>
>>>>>>>
>>>>>>>     getattr(instance, action)()
>>>>>>>   File "/opt/web-apps/web2py/gluon/dal.py", line 1633, in rollback
>>>>>>>
>>>>>>>
>>>>>>>     return self.connection.rollback()
>>>>>>> ProgrammingError: (2014, "Commands out of sync; you can't run this 
>>>>>>> command now")
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Right now the only option we've arrive at is to make sproc calls 
>>>>>>> directly through the pymysql driver API, one per connection.
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>  
>>>  
>>>  
>>>
>>
>>
>>
>> -- 
>> Profile: http://it.linkedin.com/in/compagnucciangelo 
>>
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to