基于Flask的Web应用部署到SAE上遇到的问题

时间:2024-04-21 14:35:52

我的应用底层数据库用的是MySQL,利用Flask-SQLALchemy实现接口操作。我遇到的问题是:

在我把代码部署到SAE上后,当数据向数据库insert的时候总是出现“2006,MySQL has gone away”的问题。

查了官方文档和Google了很多,首先是用如下方法去做的:

1、SQLAlchemy_POOL_SIZE = 10

2、每次操作之后关闭数据库

def init_after_handlers(app):
@app.teardown_appcontext
def teardown_request(exception=None):
if hasattr(g, 'db'):
g.db.close()
#db2 = getattr(g, 'db2', None)
if db is not None:
db.session.remove()

但是上面的步骤对我却不起作用,真的是不应该啊!!!!!

后来又查了一下,说可以用ping,所以我此时就抛弃了利用SQLALchemy操作该部分数据,而改为直接使用MySQLdb。利用ping的方法就是不断的进行新连接。

 def _connect(self,dbname):
tar = self.config[dbname]
self.con = MySQLdb.connect(host=tar['host'],
user=tar['user'],
port=tar['port'],
passwd=tar['passwd'],
charset=tar['charset'],
db=tar['db'])
self.con.ping(True)
self.cursor = self.con.cursor(cursorclass=MySQLdb.cursors.DictCursor)

在进行插入时:

def insert_by_dic(self,table,data):
keys = data.keys()
values = []
keystr = ','.join('`' + x + '`' for x in keys)
for key in keys:
values.append(data[key])
valstr = ','.join( "'" + x + "'" if isinstance(x,unicode) \
else "'" + str(x).decode('utf8') +"'" for x in values )
sql = "INSERT INTO %s (%s) VALUES (%s) " % (table,keystr,valstr)
self.cursor.execute(sql)
self.con.commit()

 def insert_list_dic(self,data,table):
for item in data:
try:
self.insert_by_dic(table, item)
except MySQLdb.OperationalError:
self._connect(dbname)
self.insert_by_dic(table, item)
continue
except MySQLdb.IntegrityError,e:
print str(e)
continue

  

进行如上代码后,已经完全解决了2006的问题。

其实现在又遇到了一个问题,那就是我之前的分页是在后台实现的,即在model中利用pagnite实现的,但利用MySQLdb之后,实现不了,我还得学会在前端将数据进行分页。

未完待续..........................