我的应用底层数据库用的是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之后,实现不了,我还得学会在前端将数据进行分页。
未完待续..........................
时间: 2024-10-14 19:30:29