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 <ykess...@gmail.com>

> 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',Fiel**d('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.Di**ctCursor)
>>>  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

-- 



Reply via email to