我有一条烧瓶路径可以获取所有用户的列表:
@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服务器崩溃了,这意味着没有任何结果。香港专业教育学院从未有代码可以做到这一点。每当发生数据库连接或查询错误时,总是会纠正并打印该错误。
答案 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序列化。相反,这次我引发了一个异常,它不再崩溃。