首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy select语句执行随机挂起

问SQLAlchemy select语句执行随机挂起
EN

Stack Overflow用户
提问于 2015-12-15 16:32:57
回答 2查看 2.2K关注 0票数 1

以下代码:

代码语言:javascript
复制
from sqlalchemy import create_engine

class SqlLogger(object):
  def __init__(self,
               hostname = 'xxx',
               user = 'xxx',
               password = 'xxx',
               database='xxx'
               ):
    self.engine = create_engine(
      'mysql+mysqlconnector://{}:{}@{}/{}'.format(
          user,
          password,
          hostname,
          database),
      echo=False,
      pool_recycle=300) # re-connect after 5 minutes
    self.checkout(-1)


  def __del__(self):
    self.engine.dispose()


  def checkout(self,run_number):
    connection = self.engine.connect()
    print(1)
    statement = '''
      select * from INPUT_PARAMETERS
      where RUN_NUMBER = {}
      '''.format(run_number)
    print(2)
    result = connection.execute(statement)
    print(3)
    for row in result:
      print(row)
    print(4)
    connection.close()
    print(5)


sql = SqlLogger()

在随机时间无限期挂起(有时执行良好,有时挂起)。当它挂起时,它将打印1和2,即挂在connection.execute(statement)处。我连接到的服务器是google数据库。当我使用localhost时,我没有问题。

问题:可能是什么原因造成这个问题?我怎么才能避免呢?

调试信息:

下面是我使用echo="debug“时的输出。数字1和2来自脚本中的打印命令。

当它挂起时:

代码语言:javascript
复制
2015-12-15 15:36:43,997 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2015-12-15 15:36:43,997 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:44,070 DEBUG sqlalchemy.engine.base.Engine Col (u'Variable_name', u'Value')
2015-12-15 15:36:44,071 DEBUG sqlalchemy.engine.base.Engine Row (u'sql_mode', u'NO_ENGINE_SUBSTITUTION')
2015-12-15 15:36:44,249 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2015-12-15 15:36:44,250 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:44,322 DEBUG sqlalchemy.engine.base.Engine Col (u'DATABASE()',)
2015-12-15 15:36:44,322 DEBUG sqlalchemy.engine.base.Engine Row (u'SIMULATION_LOGS',)
2015-12-15 15:36:44,683 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2015-12-15 15:36:44,683 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:44,900 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2015-12-15 15:36:44,900 INFO sqlalchemy.engine.base.Engine {}
1
2
2015-12-15 15:36:45,407 INFO sqlalchemy.engine.base.Engine 
      select * from INPUT_PARAMETERS
      where RUN_NUMBER = -1

2015-12-15 15:36:45,407 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:45,486 INFO sqlalchemy.engine.base.Engine ROLLBACK

当它不悬挂时:

代码语言:javascript
复制
2015-12-15 15:36:37,100 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2015-12-15 15:36:37,100 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:37,174 DEBUG sqlalchemy.engine.base.Engine Col (u'Variable_name', u'Value')
2015-12-15 15:36:37,175 DEBUG sqlalchemy.engine.base.Engine Row (u'sql_mode', u'NO_ENGINE_SUBSTITUTION')
2015-12-15 15:36:37,318 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2015-12-15 15:36:37,318 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:37,390 DEBUG sqlalchemy.engine.base.Engine Col (u'DATABASE()',)
2015-12-15 15:36:37,390 DEBUG sqlalchemy.engine.base.Engine Row (u'SIMULATION_LOGS',)
2015-12-15 15:36:37,779 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2015-12-15 15:36:37,779 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:37,994 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2015-12-15 15:36:37,994 INFO sqlalchemy.engine.base.Engine {}
1
2
2015-12-15 15:36:38,520 INFO sqlalchemy.engine.base.Engine 
      select * from INPUT_PARAMETERS
      where RUN_NUMBER = -1

2015-12-15 15:36:38,520 INFO sqlalchemy.engine.base.Engine {}
2015-12-15 15:36:38,603 DEBUG sqlalchemy.engine.base.Engine Col (u'RUN_NUMBER', ...)
3
4
5

当我在查询之前插入一个connection.begin() (即,在print(1)命令之前),我会得到一个实际的错误消息,而不是冻结。下面是回显语句之后的调试输出,前面的所有内容都与上面相同:

代码语言:javascript
复制
2015-12-15 18:47:04,044 INFO sqlalchemy.engine.base.Engine 
      select * from INPUT_PARAMETERS
      where RUN_NUMBER = 1

2015-12-15 18:47:04,044 INFO sqlalchemy.engine.base.Engine {}
Traceback (most recent call last):
  File "sql_connection.py", line 44, in <module>
    sql = SqlLogger()
  File "sql_connection.py", line 19, in __init__
    self.checkout(1)
  File "sql_connection.py", line 35, in checkout
    result = connection.execute(statement)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 906, in execute
    return self._execute_text(object, multiparams, params)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1054, in _execute_text
    statement, parameters
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1146, in _execute_context
    context)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1344, in _handle_dbapi_exception
    util.reraise(*exc_info)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
    context)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 450, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/lib64/python2.7/site-packages/mysql/connector/cursor.py", line 514, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/usr/lib64/python2.7/site-packages/mysql/connector/connection.py", line 488, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/usr/lib64/python2.7/site-packages/mysql/connector/connection.py", line 409, in _handle_result
    columns[i] = self._protocol.parse_column(self._socket.recv())
  File "/usr/lib64/python2.7/site-packages/mysql/connector/protocol.py", line 234, in parse_column
    (packet, _) = utils.read_lc_string(packet)  # table
  File "/usr/lib64/python2.7/site-packages/mysql/connector/utils.py", line 199, in read_lc_string
    if buf[0] == 251:  # \xfb
IndexError: bytearray index out of range
EN

回答 2

Stack Overflow用户

发布于 2015-12-16 00:10:33

这更多是一种解决办法,而不是一种解决方案。似乎这个问题只存在于使用mysql-连接器时。当用engine = create_engine('mysql+mysqlconnector://...')替换engine = create_engine('mysql+mysqldb://...')时,我不会遇到上述错误。

票数 0
EN

Stack Overflow用户

发布于 2016-07-19 18:28:36

在使用mysql.connector.__version__ == 2.0.3时,我也遇到了同样的问题。升级到2.1.3版本是一个解决方案。

您可以在网站上找到mysq.connector的最新版本:mysql连接器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34294537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档