发出HTTP请求时奇怪的烧瓶服务器崩溃和数据库错误

时间:2020-07-02 08:37:11

标签: python http flask sqlalchemy flask-sqlalchemy

我有一条烧瓶路径可以获取所有用户的列表:

@app.route('/api/user/get_users', methods=['GET'])
def get_users():
    return user.get_users(request)


def get_users(self, request):
    users = fdb.read("""SELECT * FROM _users""", (), True)
    return jsonify({
        "allUsers": users
    })

fdb.read只是以下代码的抽象:

def read(self, query_string, query_params = (), fetchall = True):
    try:
        data = self.connection.execute(query_string, query_params)
        if fetchall: 
            data = data.fetchall()
            data = [dict(row) for row in data]
        else:
            data = data.fetchone()
            data = dict(data)
        return data
    except Exception as e:
        print(e)
        return e
    finally:
        pass

这是我的连接方法:

def connect_flask_sql_alchamy(self, engine_name, user, password, host, database):
    uri = engine_name + "://" + user + ":" + password + "@" + host
    self.engine = create_engine(uri)
    self.engine.execute("USE "+database)
    self.connection = self.engine.connect()
    self.connection_type = FLASK_SQL_ALCHEMY

当我去通过浏览器或邮递员发出请求时,哪一个工作得很好。但是,如果我使用Axios / fetch或任何其他xhr HTTP请求工具,则会得到一组结果。结果是-它不起作用,但是很奇怪的是,每次请求相同的请求时,我都会遇到不同的错误,有时,在点击此路由后,本地烧瓶服务器将突然崩溃,而没有任何错误消息。 这是我看到的最常见的错误:

Error closing cursor
Traceback (most recent call last):
  File "/home/dimo/.local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1375, in _safe_close_cursor
    cursor.close()
  File "/usr/lib/python3.8/site-packages/MySQLdb/cursors.py", line 86, in close
    while self.nextset():
  File "/usr/lib/python3.8/site-packages/MySQLdb/cursors.py", line 139, in nextset
    nr = db.next_result()
MySQLdb._exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")
127.0.0.1 - - [02/Jul/2020 10:09:14] "GET /api/general/get_general_data HTTP/1.1" 200 -

我也有一些:

(MySQLdb._exceptions.OperationalError) (1046, 'No database selected')
[SQL: SELECT * FROM _users]
(Background on this error at: http://sqlalche.me/e/e3q8)

我目前一直保持连接打开状态。这可能是原因吗?我有些怀疑,可能需要在连接上调用commit(),然后在每个C/R/U/D方法之后关闭连接,但事实是它使Flask服务器崩溃了,这意味着没有任何结果。香港专业教育学院从未有代码可以做到这一点。每当发生数据库连接或查询错误时,总是会纠正并打印该错误。

1 个答案:

答案 0 :(得分:0)

显然,“引擎”是一个完整的连接池,而我对“ use”语句的使用只会对其中一个连接有效-并非全部。

要解决此问题,我通过URI连接到数据库,而不是执行use Database命令:

uri = engine_name + "://" + user + ":" + password + "@" + host + "/" + database

代替:

uri = engine_name + "://" + user + ":" + password + "@" + host
self.engine = create_engine(uri)
self.engine.execute("USE "+database)

那解决了我数据库连接失败的问题。服务器崩溃实际上是由其他原因引起的-我返回了一个异常,他们试图对它进行JSON序列化。相反,这次我引发了一个异常,它不再崩溃。